json.dumps搞砸了秩序

The*_*Lad 28 python json

我正在使用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的东西.

  • 即使JSON是无序的,在json库中对它进行有序抽象仍然是有用的,原因与OrderedDict有用的原因相同.例如,我想为人类和机器的可读性输出一些JSON对象,我想保留人类方面的特定键顺序. (11认同)
  • 具有一致顺序的原因之一是,您是否需要生成JSON响应,然后构建哈希以在ETag或缓存中使用。在这种情况下,我们不需要按特定顺序排列,但是我们确实需要按一致且可复制的顺序排列。每次调用它时,您都应该获得相同的字符串。json.dumps(d,sort_keys = True)将完成此操作。 (2认同)
  • 美中不足:Python 3.6+ 字典 * 已* 订购。 (2认同)

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)

  • 这很有趣。是否保证“json.dumps()”保留“OrderedDict”“b”的顺序?我在文档中找不到任何内容。 (2认同)
  • 我也不是,但在文档中正式保证它(对于`json`模块的当前和未来版本)会很好,特别是因为JSON本身没有任何有序的键/值对的概念(http: //json.org). (2认同)

Sha*_*rSh 12

这是一本字典,字典不保持秩序.您可以使用OrderedDict.

您还可以添加sort_keys = False参数:

json.dumps(values, sort_keys=False)
Run Code Online (Sandbox Code Playgroud)

  • sort_keys 已经默认为 False,所以这不会改变任何东西。json.dumps 不会保留提供的 OrderedDict 中的键顺序 (3认同)