Python中的JSON输出排序

82 投票
6 回答
130109 浏览
提问于 2025-04-15 22:23

我在用Python处理JSON的时候遇到了一些问题。

实际上,如果我执行这段代码,Python会给我一个排序过的JSON字符串!

比如说:

values = {
  'profile': 'testprofile',
  'format': 'RSA_RC4_Sealed',
  'enc_key': base64.b64encode(chiave_da_inviare),
  'request': base64.b64encode(data)
}

values_json = json.dumps(values, sort_keys = False, separators = (',', ':'))

这是输出结果:

{
  "profile": "testprofile",
  "enc_key": "GBWo[...]NV6w==",
  "request": "TFl[...]uYw==",
  "format": "RSA_RC4_Sealed"
}

你可以看到,我尝试使用“sort_keys=False”,但是没有任何变化。

我该怎么做才能让Python不对我的JSON字符串进行排序呢?

6 个回答

17

在其他地方讨论过的OrderedDict基本上可以解决你的问题,而'ObjDict'可能会更好。

不过,如果你需要在加载时保持顺序,那么你还需要用json.loads()把值加载到OrderedDict中。可以这样做:

from collections import OrderedDict
values=json.loads(jsontext,object_pairs_hook=OrderedDict)

否则,即使json文件的顺序是对的,加载后这个顺序也会丢失。

也许更好的解决办法是用'ObjDict'替代OrderedDict。这样做需要先用pip安装objdict。ObjDict同样能保持顺序,就像OrderedDict一样,但它还支持JSON,并且在处理这个例子时效果更好。

from objdict import ObjDict
values = ObjDict("""{"profile" : "testprofile",
      "format": "RSA_RC4_Sealed" }""")
values.enc_key = base64.b64encode(chiave_da_inviare)
values.request = base64.b64encode(data)

values_json = values.dumps(separators=(',', ':'))
111

可以试试标准库里的 OrderedDict,它属于 collections 这个模块:

>>> import json
>>> from collections import OrderedDict
>>> values = OrderedDict([('profile','testprofile'), 
                          ('format', 'RSA_RC4_Sealed'), 
                          ('enc_key', '...'), 
                          ('request', '...')])
>>> json.dumps(values, sort_keys=False)
'{"profile": "testprofile", "format": "RSA_RC4_Sealed", "enc_key": "...", "request": "..."}'

不过很遗憾,这个功能是在 2.7 版本 中新增加的,属于 collections 模块。

56

你把值存储在一个Python的dict里,这种结构本身并不关心顺序,它只是一个键值对的映射。所以,当你把这些项目放进values变量里时,它们的顺序就会丢失。

实际上,想要得到一个确定的顺序,唯一的方法就是使用sort_keys=True,我猜这会把它们按字母和数字的顺序排列。那么,顺序为什么这么重要呢?

撰写回答