我发现当运行以下命令时,python 的 json 模块(自 2.6 起包含)将 int 字典键转换为字符串。
>>> import json
>>> releases = {1: "foo-v0.1"}
>>> json.dumps(releases)
'{"1": "foo-v0.1"}'
是否有任何简单的方法可以将 key 保留为 int,而无需在转储和加载时解析字符串。 我相信使用 json 模块提供的钩子(Hook)是可能的,但这仍然需要解析。 有没有可能我忽略了一个论点? 干杯,伙计
子问题: 感谢您的回答。看到json像我担心的那样有效,有没有一种简单的方法可以通过解析转储的输出来传达 key 类型? 另外我应该注意进行转储的代码和从服务器下载 json 对象并加载它的代码都是我编写的。
最佳答案
这是各种映射集合之间的细微差别之一,可能会咬你一口。 JSON 将键视为字符串; Python 支持仅类型不同的不同键。
在 Python 中(显然在 Lua 中)映射(分别是字典或表)的键是对象引用。在 Python 中,它们必须是不可变类型,或者它们必须是实现 __hash__
方法的对象。 (Lua 文档建议它自动使用对象的 ID 作为哈希/键,即使对于可变对象也是如此,并依赖字符串实习来确保等效字符串映射到相同的对象)。
在 Perl、Javascript、awk 和许多其他语言中,散列、关联数组或给定语言所称的任何内容的键是字符串(或 Perl 中的“标量”)。在 perl 中,$foo{1}、$foo{1.0} 和 $foo{"1"}
都是对 %foo
中相同映射的引用——键被评估为标量!
JSON 最初是一种 Javascript 序列化技术。 (JSON 代表 JavaScript Object Notation。)它自然地为其映射符号实现语义符合其映射语义。
如果序列化的两端都是 Python,那么最好使用 pickle。如果你真的需要将这些从 JSON 转换回原生 Python 对象,我猜你有几个选择。首先,您可以尝试 (try: ... except: ...
) 在字典查找失败的情况下将任何键转换为数字。或者,如果您将代码添加到另一端(此 JSON 数据的序列化器或生成器),那么您可以让它对每个键值执行 JSON 序列化——将它们作为键列表提供。 (然后您的 Python 代码将首先遍历键列表,将它们实例化/反序列化为原生 Python 对象......然后使用这些对象访问映射之外的值)。
关于Python 的 json 模块,将 int 字典键转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1450957/