JSON.DUMP不可订购的类型使用NONE用作密钥



在包含带有Nonestr类型字典的对象上调用json.dumps时,我该如何对结果进行分类而不抛出例外?我正在使用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 FilesPython35libjson__init__.py", line 237, in dumps
     **kw).encode(obj)
   File "C:Program FilesPython35libjsonencoder.py", line 198, in encode
     chunks = self.iterencode(o, _one_shot=True)
   File "C:Program FilesPython35libjsonencoder.py", line 256, in iterencode
     return _iterencode(o, 0)
 TypeError: unorderable types: NoneType() < str()

事实证明null的键是无效的JSON。显然,json.dumps(...)在返回之前将None键转换为字符串'null',但大概json.dumps(..., sort_keys=True)在转换为字符串之前进行排序

我发现的一个解决方案允许排序和显示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'),但确实会始终如一。

相关内容

最新更新