【发布时间】:2013-06-10 13:49:03
【问题描述】:
根据this conversion table,当使用 JSON 模块进行序列化时,Python 整数会被写为 JSON 数字——正如我所期望和希望的那样。
我有一个带有整数键和整数值的字典:
>>> d = {1:2}
>>> type(d.items()[0][0])
<type 'int'>
>>> type(d.items()[0][1])
<type 'int'>
当我使用json模块将这个序列化为JSON字符串时,值写成数字,而key写成字符串:
>>> json.dumps(d)
'{"1": 2}'
这不是我想要的行为,而且它似乎特别糟糕,因为它打破了 json.dumps/json.loads 往返:
>>> d == json.loads(json.dumps(d))
False
为什么会发生这种情况,有没有办法可以强制将密钥写为数字?
【问题讨论】:
-
JSON 键是 always 字符串。
-
...而 JSON 使用字符串,因为它们与字节顺序无关。
-
如果 JSON 不是 严格 必需的,您可以使用 PyYAML 来代替 YAML:
d = {1:2, 3:4}; import yaml; yaml.safe_load(yaml.safe_dump(d)) == d返回 True。一般来说,YAML 的“内联”样式看起来像更灵活的 json(键可以是数字,通常不必引用字符串)。我在这里使用safe_load,因为普通yaml.load具有难以正确保护的特性(类的构造等);safe_load|dump将支持的输入/输出集限制为原始类型(bool、int、float、string、list、set、dict),因此可以安全地用于任意输入。 -
不幸的是,往返行程不适用于 yaml.safe_dump,因为它将看起来像整数的字符串转换为整数。例如。试试 d = {'1':'2'}
-
上述往返问题的错误:bitbucket.org/xi/pyyaml/issue/21
标签: python json serialization