使用None作为键时,json.dumps不可解析的类型

时间:2017-12-29 13:22:42

标签: python json

在包含json.dumpsNone类型字典的对象上调用str时,如何在不抛出异常的情况下对结果进行排序?我正在尝试使用sort_keys=True,但却抛出TypeError。我不关心Nonebar如何相对于彼此进行排序,只要它在逐次运行时是一致的。

import json
foo = {None: 7, 'bar': 8}
json.dumps(foo)

打印

'{"bar": 8, "null": 7}'

但是

json.dumps(foo, sort_keys=True)

打印

 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
   File "C:\Program Files\Python35\lib\json\__init__.py", line 237, in dumps
     **kw).encode(obj)
   File "C:\Program Files\Python35\lib\json\encoder.py", line 198, in encode
     chunks = self.iterencode(o, _one_shot=True)
   File "C:\Program Files\Python35\lib\json\encoder.py", line 256, in iterencode
     return _iterencode(o, 0)
 TypeError: unorderable types: NoneType() < str()

1 个答案:

答案 0 :(得分:0)

原来null的密钥是无效的JSON。显然,json.dumps(...)会在返回之前将None个密钥转换为字符串'null',但可能json.dumps(..., sort_keys=True)会在转换为字符串之前进行排序。< / p>

我发现允许在JSON中排序和显示结构的一个解决方案是首先将其转换为JSON,然后对键进行排序,如下所示:

import json

foo = {None: 7, 'bar': 8}
# {'bar': 8, None: 7}

foo_json = json.dumps(foo)
# '{"bar": 8, "null": 7}'

foo_prime = json.loads(foo_json)
# {'null': 7, 'bar': 8}

foo_sorted = json.dumps(foo_prime, sort_keys=True)
# '{"bar": 8, "null": 7}'

这确实会改变密钥(从None/null'null'),但会一直这样做。