Python json.loads改变了对象

时间:2017-05-04 17:37:52

标签: python json python-2.7

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

with open('data.json', 'r') as input_file:
  input_data = input_file.read()

此时input_data只包含一个字符串,现在我继续将其解析为JSON:

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

data_content具有字符串的JSON表示,这是我需要的,但由于某些原因,在json.loads之后我不清楚它正在改变键的原始顺序,所以例如,如果我的文件包含类似的东西:

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

在json.loads之后,订单被改变,让我们说:

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

为什么会这样?有没有办法保存订单?我正在使用Python 2.7。

2 个答案:

答案 0 :(得分:17)

python中的字典(对象)没有保证的顺序。因此,当解析为dict时,订单将丢失。

如果订单因某种原因很重要,您可以json.loads使用OrderedDict,而不是dict,但保存了键的顺序。

from collections import OrderedDict

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

答案 1 :(得分:4)

这不是json.load的问题。 Python中的字典不是强制执行的顺序,因此您将无法使用它;一般来说,这并不重要,因为您可以根据字符串访问元素,例如"id"