json.loads()无法保持顺序

15

我已经将字符串格式化为像JSON一样的格式,这样我就可以对其进行json.loads操作。当我在屏幕上打印时,它变得混乱了。我知道Python字典没有顺序,但是否有任何方法可以保留此顺序?我真的需要保留它。谢谢!


首先,这没有任何意义,因为Python和JSON字典都是无序的。 - Willem Van Onsem
https://dev59.com/U2w05IYBdhLWcg3w9mdW - Abdul Niyas P M
@StefanPochmann 你为什么这么说? :) 我需要这样做才能使用 json.loads - shurrok
@StefanPochmann 我从 JavaScript 代码中截取了一个字符串,它看起来类似于 JSON,但我需要将其格式化以使用 json.loads。我认为这是唯一的方法。但如果你有其他想法,请告诉我,也许我可以改进我的代码。 - shurrok
1
@StefanPochmann 嗯,相信我这是我能完成项目的唯一方式,我不需要告诉你我具体在做什么 :P 问题只是关于如何保持 json.loads() 中的顺序,现在问题已经解决了,不需要再讨论了。 - shurrok
显示剩余4条评论
1个回答

30

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

但是,您可以定义自定义的JSON解码器,然后使用该解码器进行解析。因此,在这里,字典钩子将是一个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)

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


3
json.loads(string, object_pairs_hook=OrderedDict)是什么意思? - shurrok
1
@soommy12:当然可以,但在我看来,这有点违背封装原则。现在你可以将解码器作为参数传递等。 - Willem Van Onsem
好的,我明白了,非常感谢! :) - shurrok
2
从3.7版本开始,Python字典是有序的。 - matanster

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