Python + JSON,没有发生什么事?

saf*_*afl 19 python json dictionary

转储和装载的字典与None关键,结果在一个字典'null'作为重点.

值不受影响,但如果'null'实际存在字符串键,情况会变得更糟.

我在这做错了什么?为什么我不能dictNone键序列化/反序列化?

>>> json.loads(json.dumps({'123':None, None:'What happened to None?'}))
{u'123': None, u'null': u'What happened to None?'}
>>> json.loads(json.dumps({'123':None, None:'What happened to None?', 'null': 'boom'}))
{u'123': None, u'null': u'boom'}
Run Code Online (Sandbox Code Playgroud)

dan*_*n04 28

JSON对象是字符串到值的映射.如果您尝试使用其他类型的密钥,它们将转换为字符串.

>>> json.loads(json.dumps({123: None}))
{'123': None}
>>> json.loads(json.dumps({None: None}))
{'null': None}
Run Code Online (Sandbox Code Playgroud)


Dir*_*irk 12

根据规范,None不是有效的密钥.它相当于一个JSON对象表达式,看起来像

{ ..., null: ..., ... }
Run Code Online (Sandbox Code Playgroud)

这是无效的(即,无法使用语法图生成.)

可以说,JSON模块应该在序列化时引发异常,而不是静默生成值的字符串表示.

编辑刚刚看到,模块的行为已被记录(有些含蓄):

如果skipkeys为True(默认值:False),则将跳过不是基本类型(str,unicode,int,long,float,bool,None)的dict键,而不是引发TypeError.

所以看起来好像这种行为是有意的(鉴于当前的JSON规范,我仍然觉得它有问题).

  • SkipKeys 不会对观察到的行为产生影响。“None”是基本类型,因此skipKeys=True不会导致“跳过”,就像skipKeys=False不会导致TypeError一样。我希望在文档中添加一个小注释,例如:“对于可逆编码,仅使用字符串作为键。” (2认同)

小智 5

正如 @dan04 所示,None转换为'null'.

一切都很好,该值存储到字典中

"null": "What happened to None?"
Run Code Online (Sandbox Code Playgroud)

但随后又传来了另一个Key的电话'null'

因此 None/ 'null'-Key ( "What happened to None?") 的旧值被 覆盖"boom"