在包含带有None
和str
类型字典的对象上调用json.dumps
时,我该如何对结果进行分类而不抛出例外?我正在使用sort_keys=True
尝试,但这扔了TypeError
。我不在乎None
和bar
如何相对于彼此进行分类,只要它与运行之间保持一致。
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'
),但确实会始终如一。