Python+;JSON,没有发生什么事?
转储和加载带有as键的dict会导致带有Python+;JSON,没有发生什么事?,python,json,dictionary,Python,Json,Dictionary,转储和加载带有as键的dict会导致带有'null'键的dict 值不受影响,但如果字符串键'null'实际存在,情况会变得更糟 我做错了什么?为什么我不能用None键序列化/反序列化 例子 根据,None不是有效密钥。它相当于一个JSON对象表达式,如下所示 { ..., null: ..., ... } 无效(即,无法使用语法图生成。) 可以说,JSON模块应该在序列化时引发异常,而不是静默地生成值的字符串表示 EDIT刚刚看到,模块的行为(有点含蓄): 如果skipkeys为True(默
'null'
键的dict
值不受影响,但如果字符串键'null'
实际存在,情况会变得更糟
我做错了什么?为什么我不能用None
键序列化/反序列化
例子
根据,None
不是有效密钥。它相当于一个JSON对象表达式,如下所示
{ ..., null: ..., ... }
无效(即,无法使用语法图生成。)
可以说,JSON模块应该在序列化时引发异常,而不是静默地生成值的字符串表示
EDIT刚刚看到,模块的行为(有点含蓄):
如果skipkeys为True(默认值:False),则将跳过非基本类型(str、unicode、int、long、float、bool、None)的dict键,而不是引发TypeError
因此,似乎这种行为是故意的(考虑到当前的JSON规范,我仍然觉得有问题)。JSON对象是字符串到值的映射。如果您尝试使用其他类型的键,它们将被转换为字符串
>>> json.loads(json.dumps({123: None}))
{'123': None}
>>> json.loads(json.dumps({None: None}))
{'null': None}
如@dan04所示,
None
被转换为'null'
一切正常,值存储在dict中
“null”:“一个都没有发生什么事?”
但随后出现了另一个键,名为'null'
因此,None/
'null'
-键(“None发生了什么事?”
)的旧值被“boom”
skipKeys覆盖,对观察到的行为没有影响。“None”是一个基本类型,因此skipKeys=True不会导致“跳过”,正如skipKeys=False不会导致类型错误一样。我希望文档中有一个小注释,比如:“对于可逆编码,只使用字符串作为键。”顺便说一句,第二个代码的输出似乎被篡改了。
>>> json.loads(json.dumps({123: None}))
{'123': None}
>>> json.loads(json.dumps({None: None}))
{'null': None}