我正在使用json模块创建一个json包含类似条目的文件
json.dumps({"fields": { "name": "%s", "city": "%s", "status": "%s", "country": "%s" }})
Run Code Online (Sandbox Code Playgroud)
但是,在json创建的-file中,字段的顺序错误
{"fields": {"status": "%s", "city": "%s", "name": "%s", "country": "%s"}}
Run Code Online (Sandbox Code Playgroud)
这是一个问题,因为%s-strings的替换现在是不正确的.
如何强制dumps函数保持给定的顺序?
Eri*_*got 31
就像其他答案正确陈述一样,在Python 3.6之前,字典是无序的.
也就是说,JSON也应该具有无序映射,因此原则上将有序字典存储在JSON中没有多大意义.具体地说,这意味着在读取JSON对象时,返回键的顺序可以是任意的.
因此,在JSON中保留映射顺序(如Python OrderedDict)的一种好方法是输出一个(键,值)对的数组,在读取时转换回有序映射:
>>> 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
Run Code Online (Sandbox Code Playgroud)
(注意从(键,值)对列表构造有序字典的方式:OrderedDict({1: 10, 2: 20})不起作用:它的键不一定按字典文字排序,因为文字创建了一个键字无序的Python字典.)
PS:从Python 3.1开始,json模块提供了一个钩子,用于自动将对列表(如上所述)转换为其他类似OrderedDict的东西.
Ant*_*ins 23
在创建json对象时,可以选择OrderedDict使用而不是普通dict对象来记住插入的顺序:
>>> from collections import OrderedDict
>>> a = '{"fields": { "name": "%s", "city": "%s", "status": "%s", "country": "%s" }}'
>>> b = json.loads(a, object_pairs_hook=OrderedDict)
>>> json.dumps(b)
'{"fields": {"name": "%s", "city": "%s", "status": "%s", "country": "%s"}}'
Run Code Online (Sandbox Code Playgroud)
Sha*_*rSh 12
这是一本字典,字典不保持秩序.您可以使用OrderedDict.
您还可以添加sort_keys = False参数:
json.dumps(values, sort_keys=False)
Run Code Online (Sandbox Code Playgroud)