Python 的 json 模块,将 int 字典键转换为字符串

标签 python json

我发现当运行以下命令时,python 的 json 模块(自 2.6 起包含)将 int 字典键转换为字符串。

>>> import json
>>> releases = {1: "foo-v0.1"}
>>> json.dumps(releases)
'{"1": "foo-v0.1"}'

是否有任何简单的方法可以将 key 保留为 int,而无需在转储和加载时解析字符串。 我相信使用 json 模块提供的钩子(Hook)是可能的,但这仍然需要解析。 有没有可能我忽略了一个论点? 干杯,伙计

子问题: 感谢您的回答。看到j​​son像我担心的那样有效,有没有一种简单的方法可以通过解析转储的输出来传达 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/

相关文章:

html - 使用关键字从 data.json 文件中搜索数据

python - 是否可以在 Django 模板语言中定位 html 元素的值?

python - 外键约束在 SQLite 上无法正常工作

Python返回类型注释

python - 我有一些编号的列表(CSV)。与某些 zip 文件名相同。我只想解压那些特定的 zip 文件

java - Android:从 MySQL 检索数据

json - WCF 休息大 json 错误

javascript - json 变量未定义

python - 按条件和列中的最小值过滤 Pandas 数据框

json - 将嵌套映射编码为 JSON