Python 3中JSON dumps/loads将字典整数键转为字符串的问题问询
关于Python字典序列化反序列化后键类型变化的问题
这既不是你的理解有误,也不是Python 3本身的问题——核心原因出在你使用的序列化格式(比如JSON)的规则限制上。
为什么会出现键类型转换?
像JSON这种通用序列化格式,它的语法规则里明确规定:对象的键只能是字符串类型,并不支持整数、列表等其他类型作为键。而Python的字典则灵活得多,允许任何可哈希的类型(比如整数、字符串、元组等)作为键。
当你用json模块这类工具序列化Python字典时,库会自动将非字符串的键转换为字符串来符合JSON的规范;反序列化时,JSON对象的键只会被解析成字符串,于是就出现了你看到的整数键变成'0'、'1'的情况。举个实际代码例子:
import json original_dict = {0: 'object0', 1: 'object2'} # 序列化 json_str = json.dumps(original_dict) print(json_str) # 输出: {"0": "object0", "1": "object2"} # 反序列化 result_dict = json.loads(json_str) print(result_dict) # 输出: {'0': 'object0', '1': 'object2'}
如何保留字典键的原始类型?
如果你需要完整保留Python字典的键类型,可以使用Python专属的序列化工具pickle。它是专门为Python对象设计的序列化机制,能精准保留对象的所有类型信息:
import pickle original_dict = {0: 'object0', 1: 'object2'} # 序列化(二进制格式) pickle_bytes = pickle.dumps(original_dict) # 反序列化 result_dict = pickle.loads(pickle_bytes) print(result_dict) # 输出: {0: 'object0', 1: 'object2'},和原字典完全一致
不过要注意,pickle的序列化结果是二进制的,只能在Python环境中反序列化,不具备JSON那样的跨语言通用性,所以需要根据你的实际使用场景来选择合适的方案。
内容的提问来源于stack exchange,提问作者Alkor
相关产品推荐
相关产品推荐

