Python中的JSON输出排序

2024-05-12 16:06:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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字符串进行排序?


Tags: key字符串jsonformat排序requestprofilersa
3条回答

其他地方讨论过的OrderedDict是解决问题的主要方法,而ObjDict可能更好。

但是,如果需要在加载时维护顺序,则还需要json.loads()将值加载到OrderedDict中。做这个用途

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

否则,即使json文件是有序的,加载时该顺序也将丢失。

或许更好的解决方案是使用“ObjDict”代替orderedict。 这需要pip安装objdict。ObjDict仍然像orderedict一样维护订单,但也带来了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=(',', ':'))

您正在将值存储到Python^{}中,Python根本没有内在的排序概念,它只是一个键到值的映射。因此,当您将项目放入values变量时,它们将失去所有顺序。

事实上,获得确定性排序的唯一方法是使用sort_keys=True,我假设将它们放在字母数字排序中。为什么订单这么重要?

从标准库尝试^{}

>>> 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": "..."}'

不幸的是,这个特性是New in version 2.7对于collections

相关问题 更多 >