我发现运行以下命令时,python的json模块(自2.6起包含)将int字典键转换为字符串。
>>> import json >>> releases = {1: "foo-v0.1"} >>> json.dumps(releases) '{"1": "foo-v0.1"}'
有什么简单的方法可以将键保留为int,而无需在转储和加载时解析字符串。我相信可以使用json模块提供的钩子,但这仍然需要解析。我可能会忽略一个论点吗?欢呼声,查兹
子问题:感谢您的回答。看到json像我所担心的那样工作,是否有一种简单的方法可以通过解析转储的输出来传达密钥类型?我还要注意执行转储的代码以及从服务器下载json对象并加载它的代码均由我编写。
这是可能困扰您的各种映射集合之间的细微差异之一。JSON将键视为字符串;Python支持仅在类型上不同的独特键。
在Python中(显然在Lua中),映射的键(分别是字典或表)是对象引用。在Python中,它们必须是不可变的类型,或者它们必须是实现__hash__方法的对象。(Lua文档建议,即使对于可变对象,它也会自动将对象的ID用作哈希/键,并依赖于字符串插入以确保等效的字符串映射到相同的对象)。
__hash__
在Perl,Javascript,awk和许多其他语言中,散列,关联数组或给定语言所调用的任何键都是字符串(或Perl中的“标量”)。在perl $foo{1}, $foo{1.0}, and $foo{"1"}中,对%foo-–中的同一映射的所有引用都被 评估 为标量!
$foo{1}, $foo{1.0}, and $foo{"1"}
%foo
JSON是从Javascript序列化技术开始的。(JSON代表 Ĵ AVA 小号 CRIPT ö bject Ñ 浮选。)当然它实现为它的映射符号的语义这与它的映射语义一致。
如果序列化的两端都将是Python,那么最好使用咸菜。如果您确实需要将这些从JSON转换回本机Python对象,我想您有两种选择。首先try: ... except: ...,如果字典查找失败,您可以尝试()将任何键转换为数字。或者,如果将代码添加到另一端(此JSON数据的序列化器或生成器),则可以让它对每个键值执行JSON序列化
try: ... except: ...
将其作为键列表提供。(然后,您的Python代码将首先在键列表上进行迭代,将它们实例化/反序列化为本地Python对象…,然后使用那些键从映射中访问值)。