【问题标题】:json.loads() doesn't keep order [duplicate]json.loads() 不保持秩序[重复]
【发布时间】:2018-04-17 02:06:44
【问题描述】:

我已将我的字符串格式化为 JSON,因此我可以在其上执行 json.loads。当我在屏幕上打印时,结果发现它弄乱了顺序。我知道 Python 字典没有排序,但有什么方法可以保持这个顺序吗?我真的需要保留它。谢谢!

【问题讨论】:

  • 好吧,这首先没有任何意义,因为 Python 和 JSON 字典都是无序的。
  • 我读到 Python 中有类似 OrderedDict 的东西,这不是很有帮助吗?
  • “将我的字符串格式化为 JSON 格式” - 听起来你这样做的方式很糟糕......
  • @StefanPochmann 好吧,相信我,这是我完成项目的唯一方法,我不需要告诉你我在做什么:P 问题是关于在json.loads() 中保持秩序,并且问题解决了,不用讨论了

标签: python json python-2.7


【解决方案1】:

两个 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 而不是字典中。但请注意 - 如前所述 - order of the keys of JSON objects is unspecified.

或者,您也可以将挂钩传递给loads 函数:

from json import loads
from collections import OrderedDict

loads(your_json_string, object_pairs_hook=OrderedDict)

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

【讨论】:

  • json.loads(string, object_pairs_hook_=OrderedDict) 呢?
  • @soommy12:当然,但这在我看来有点违反封装原则。现在您可以将解码器作为参数传递,等等。
  • 好的,我明白了,非常感谢! :)
  • 从 3.7 开始,python dicts 是有序的
猜你喜欢
  • 2017-05-29
  • 1970-01-01
  • 1970-01-01
  • 2013-07-22
  • 2017-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多