json.loads()不保持顺序[重复]


问题内容

这个问题已经在这里有了答案

Python json.loads更改对象的顺序 (2个答案)

3年前关闭。

我已经格式化了String使其看起来像JSON这样,以便可以对其进行json.loads处理。当我在屏幕上打印时,结果发现它弄乱了顺序。我知道Python字典不排序,但是有什么方法可以保持此顺序?我真的需要保留它。谢谢!


问题答案:

这两个JSON en Python字典(都是JSON对象)都是无序的。因此,实际上这样做没有 任何 意义,因为JSON编码器可以更改顺序。

但是,您可以定义一个自定义JSON解码器,然后使用该解码器进行解析。因此,这里的字典hook willl是OrderedDict

from json import JSONDecoder
from collections import OrderedDict

customdecoder = JSONDecoder(object_pairs_hook=OrderedDict)

然后,您可以使用以下代码进行解码:

customdecoder.decode(your_json_string)

因此,这会将项目存储在OrderedDict而不是字典中。但是请注意,如前所述,JSON对象的键顺序未指定

另外,您也可以将钩子传递给loads函数:

from json import loads
from collections import OrderedDict

loads(your_json_string, object_pairs_hook=OrderedDict)

更新 :从python-3.7开始,字典保留插入顺序。所以,如果一个应用中的python-3.7,标准json.loadjson.loads应该正常工作。但是请注意,JSON对象仍然是无序的,因此JavaScript端可以按任何顺序加载/转储该对象。