Python+JSON,没有发生什么?

2024-05-19 00:00:23 发布

您现在位置:Python中文网/ 问答频道 /正文

转储和加载以^{}为键的dict,将导致以'null'为键的dictionary

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

我在这里做错什么了?为什么我不能用None键序列化/反序列化^{}

示例

>>> 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'}

Tags: to字符串nonejsondictionary序列化情况what
3条回答

根据specificationNone不是有效的密钥。它相当于一个JSON对象表达式,如下所示

{ ..., null: ..., ... }

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

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

编辑刚刚看到,模块的行为是documented(有些含蓄):

If skipkeys is True (default: False), then dict keys that are not of a basic type (str, unicode, int, long, float, bool, None) will be skipped instead of raising a TypeError.

所以看起来,这种行为似乎是有意的(考虑到当前的JSON规范,我仍然觉得它有问题)。

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

一切都很好,值存储在

"null": "What happened to None?"

但随后又来了一个名为'null'的密钥。

所以None/'null'-键("What happened to None?")的旧值被"boom"覆盖。

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

>>> json.loads(json.dumps({123: None}))
{'123': None}
>>> json.loads(json.dumps({None: None}))
{'null': None}

相关问题 更多 >

    热门问题