一尘不染

json.dumps弄乱顺序

json

我正在使用json模块创建一个json包含类似条目的文件

json.dumps({"fields": { "name": "%s", "city": "%s", "status": "%s", "country": "%s" }})

但是,在json创建的-file文件中,字段顺序错误

{"fields": {"status": "%s", "city": "%s", "name": "%s", "country": "%s"}}

这是一个问题,因为%s-strings的替换现在不正确。

如何强制dumps功能保持给定顺序?


阅读 783

收藏
2020-07-27

共1个答案

一尘不染

像其他答案正确指出的那样,在Python 3.6之前,字典是 无序的

就是说,JSON还应该具有 _无序_映射,因此原则上在JSON中存储有序字典没有多大意义。具体来说,这意味着在读取JSON对象时,返回键的顺序可以是任意的。

因此,在JSON中保留映射顺序(例如PythonOrderedDict)的一种好方法是输出一个(键,值)对的数组,您在读取时将其转换回有序映射:

>>> from collections import OrderedDict
>>> import json
>>> d = OrderedDict([(1, 10), (2, 20)])                                         
>>> print d[2]
20
>>> json_format = json.dumps(d.items())                   
>>> print json_format  # Order maintained
[[1, 10], [2, 20]]
>>> OrderedDict(json.loads(json_format))  # Reading from JSON: works!
OrderedDict([(1, 10), (2, 20)])
>>> _[2]  # This works!
20

(请注意,从(键,值)对的 列表 构造有序字典的方式:OrderedDict({1: 10, 2: 20})将不起作用:它的键不一定像字典文字中那样是有序的,因为该文字创建了一个Python字典,其键是无序的。)

PS :从Python
3.1开始,json模块提供了一个挂钩,用于自动将成对的列表(如上)转换为其他类似OrderedDict的对象。

2020-07-27