我正在使用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的替换现在不正确。
%s
如何强制dumps功能保持给定顺序?
dumps
像其他答案正确指出的那样,在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字典,其键是无序的。)
OrderedDict({1: 10, 2: 20})
PS :从Python 3.1开始,json模块提供了一个挂钩,用于自动将成对的列表(如上)转换为其他类似OrderedDict的对象。