Python json.loads更改对象的顺序

Python json.loads更改对象的顺序,python,json,python-2.7,Python,Json,Python 2.7,我有一个包含JSON对象的文件。它已按以下方式加载: with open('data.json', 'r') as input_file: input_data = input_file.read() 此时,input_数据只包含一个字符串,现在我继续将其解析为JSON: data_content = json.loads(input_data.decode('utf-8')) data_content具有字符串的JSON表示形式,这正是我所需要的,但由于某些原因,在JSON.loads

我有一个包含JSON对象的文件。它已按以下方式加载:

with open('data.json', 'r') as input_file:
  input_data = input_file.read()
此时,input_数据只包含一个字符串,现在我继续将其解析为JSON:

data_content = json.loads(input_data.decode('utf-8'))
data_content具有字符串的JSON表示形式,这正是我所需要的,但由于某些原因,在JSON.loads之后,我并不清楚它正在改变键的原始顺序,因此,例如,如果我的文件包含以下内容:

{ "z_id": 312312,
  "fname": "test",
  "program": "none",
  "org": null
}
{ "fname": "test",
  "program": None,
  "z_id": 312312,
  "org": "none"
}
加载json.loads后,顺序将更改为:

{ "z_id": 312312,
  "fname": "test",
  "program": "none",
  "org": null
}
{ "fname": "test",
  "program": None,
  "z_id": 312312,
  "org": "none"
}

为什么会这样?有没有办法维持秩序?我使用的是Python 2.7。

这不是json.load的问题。Python中的字典不是按顺序执行的,因此您将使其失去顺序;一般来说,这并不重要,因为您基于字符串访问元素,比如python中的字典(对象)没有保证的顺序。因此,当解析为
dict
时,顺序将丢失

如果出于某种原因,顺序很重要,您可以使用
json.loads
代替
orderedict
,这类似于
dict
,但键的顺序会被保存

from collections import OrderedDict

data_content = json.loads(input_data.decode('utf-8'), object_pairs_hook=OrderedDict)

为什么你需要字典顺序?如果你真的需要顺序,那么我认为这是一个糟糕的例子,因为键是按字母顺序排列的。我将编辑示例。我的观点是,我希望对象不被改变,而是保持它最初的顺序。如果需要顺序,那么使用Python3.6:另请参见:在这种情况下,这很重要,因为我必须将数据转储到excel文件中,并且需要保留结构。我的所有文件都不会具有相同的结构,因此无法单独访问每个元素