Python中的JSON输出排序

时间:2010-05-05 15:01:45

标签: python json sorting

我在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 个答案:

答案 0 :(得分:92)

从标准库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": "..."}'

不幸的是,New in version 2.7

的此功能为collections

答案 1 :(得分:51)

您正在将值存储到python dict中,它根本就没有排序的概念,它只是一个键=>价值图。因此,当您将它们放入“值”变量时,您的项目将失去所有排序。

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

答案 2 :(得分:14)

如其他地方所讨论的OrderedDict是您问题的大部分解决方案,而'ObjDict'可能会更好。

但是,如果您需要在加载时维护订单,那么您还需要json.loads()将值加载到OrderedDict中。为此,请使用

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

否则即使json文件按顺序排列,加载时该命令也会丢失。

或许更好的解决方案是使用'ObjDict'代替OrderedDict。 这需要一个pip install 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=(',', ':'))

答案 3 :(得分:6)

如果指定sort_keys=False,那么Python将只是以它们在底层Python dict对象中出现的顺序打印项目。在某些情况下,这可能与默认的字母数字排序顺序相同。在您的示例中,键甚至不是那样排序的,因为“格式”出现在“请求”之后。无论如何,sort_keys参数仍然有效,如此示例代码所示:

>>> import json
>>> json.dumps({"a":5, "b":6, "c":7}, sort_keys=False)
'{"a": 5, "c": 7, "b": 6}'

答案 4 :(得分:4)

密钥未排序:“profile”,“enc_key”,“request”,“format”。

听起来你希望它们以你在字典中创建它们的顺序出现,但字典本身是未排序的,它们不记得你插入键的顺序。

您可以使用许多SortedDict实现,但json编码器不会知道使用它来按您想要的顺序获取密钥。

答案 5 :(得分:1)

您可以使用简单的json.dumps作为

对json数据进行排序
sotred_json = json.dumps(values, sort_keys=True)

如果您不需要排序,只需提供

unsotred_json = json.dumps(values)  

或:

unsotred_json = json.dumps(values, sort_keys=False)