Python中的JSON输出排序
我在用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
,我猜这会把它们按字母和数字的顺序排列。那么,顺序为什么这么重要呢?