json.loads()没有保持秩序

时间:2017-11-04 13:05:35

标签: python json python-2.7

我已将我的字符串格式化为JSON,因此我可以对其进行json.loads。当我在屏幕上打印时,它结果搞砸了订单。我知道Python的dictonaries没有订购,但有没有办法保持这个顺序?我真的需要保留它。谢谢!

1 个答案:

答案 0 :(得分:9)

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端可以按任何顺序加载/转储对象。