Python的json.loads改变了对象的顺序

20

我有一个包含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
为什么需要字典顺序? - Azat Ibrakov
1
如果你真的需要顺序,那么可以参考这个链接:https://dev59.com/U2w05IYBdhLWcg3w9mdW - tdelaney
我认为这是一个糟糕的例子,因为键按字母顺序排序。我会编辑这个例子。我的观点是我希望对象不被改变,但保持其最初的顺序。 - Sebastian
如果您需要排序,请使用Python3.6:https://dev59.com/6VkS5IYBdhLWcg3wXFg9 - Maurice Meyer
1
参见:https://dev59.com/U2w05IYBdhLWcg3w9mdW - dreftymac
2个回答

34

在Python中,字典(对象)没有保证的顺序。因此,在解析为dict时,顺序会丢失。

如果某些情况下顺序很重要,可以让json.loads使用OrderedDict,它类似于一个dict,但是键的顺序被保存下来了。

from collections import OrderedDict

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

9
自 Python 3.7 起,json.loads 默认会保留字典的顺序。 - user202729

3

这并不是json.load的问题。Python中的字典没有顺序限制,所以你会得到无序的结果;一般来说,这并不重要,因为你根据字符串访问元素,比如"id"


5
在此情况下,这是很重要的,因为我需要将数据导入Excel文件并保留结构。由于我的所有文件结构都不相同,所以无法单独访问每个元素。 - Sebastian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接