在Python中的JSON输出sorting
我在python中遇到了JSON问题。
事实上,如果我尝试执行这个代码,Python给了我一个sorting的JSONstring!
例如:
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”,但没有任何改变。
我怎样才能停止Pythonsorting我的JSONstring?
你正在将你的值存储到一个python 字典中 ,它根本没有固有的有序的概念,它只是一个key =>值映射。 所以当你把它们放到“values”variables中时,你的物品会失去所有的顺序。
实际上,获得确定性sorting的唯一方法是使用“sort_keys = True”,我假定它们以字母数字sorting。 为什么订单如此重要?
试试标准库collections
OrderedDict
:
>>> 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
New in version 2.7
是New in version 2.7
如果你指定sort_keys=False
那么Python将简单地按照它们出现在底层Python dict对象中的顺序打印这些项目。 在某些情况下,这可能与默认的字母数字sorting顺序相同。 在你的例子中,键甚至没有这样sorting,因为“格式”是在“请求”之后。 无论如何, sort_keys
参数仍然有效,如此示例代码所certificate的那样:
>>> import json >>> json.dumps({"a":5, "b":6, "c":7}, sort_keys=False) '{"a": 5, "c": 7, "b": 6}'
在别处讨论的OrderedDict是解决您的问题的大部分解决scheme,而“ObjDict”可能更好。
但是,如果您需要在加载时保留的顺序,那么您还需要使用json.loads()将值加载到OrderedDict中。 要做到这一点使用
from collections import OrderedDict values=json.loads(jsontext,object_pairs_hook=OrderedDict)
否则,即使json文件将按顺序,加载时,该订单将会丢失。
也许更好的解决方法是使用“ObjDict”来代替OrderedDict。 这需要一个点子安装objdict。 与OrderedDict一样,ObjDict仍然保持顺序,但也带来了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=(',', ':'))
密钥没有sorting:“profile”,“enc_key”,“request”,“format”。
这听起来像你希望他们出现在你在字典中创build他们相同的顺序,但字典本质上是未分类的,他们不记得你插入的键的顺序。
有许多SortedDict实现可以使用,但是json编码器不知道如何使用它来按照你想要的顺序得到密钥。