序列化Python字典时为何整数键变为字符串?
问题原因与解决方案
为什么整数键会变成字符串?
JSON规范明确规定,对象的键(属性名)必须是字符串类型。Python的json模块在序列化字典时会严格遵循这一规范,自动将整数键转换为字符串——这是符合规范的正常行为,并非代码错误。
解决方案
根据需求,有两种常见处理方式:
1. 读取JSON时将字符串键转回整数
如果只是自己的程序需要使用整数键,最稳妥的方式是在读取JSON文件时,把字符串键转换为整数。可以通过json.load()的object_hook参数实现:
import json def dict_keys_to_int(obj): # 仅处理字典类型,将可转为整数的键转换为int if isinstance(obj, dict): return {int(k): v for k, v in obj.items() if k.lstrip('-').isdigit()} return obj # 读取并转换 with open('foo.json', 'r') as fp: data = json.load(fp, object_hook=dict_keys_to_int) # 验证键类型 print(type(next(iter(data.keys())))) # 输出 <class 'int'>
2. 自定义序列化格式(符合规范的推荐方案)
如果需要JSON文件中直观保留整数类型的标识,推荐将字典转换为键值对数组的形式(完全符合JSON规范):
import json n_chapter_range = {1: [1,7], 2: [8,293]} # 转换为规范的键值对数组 formatted_data = [{"chapter": k, "range": v} for k, v in n_chapter_range.items()] with open('chapter_range.json', 'w') as fp: json.dump(formatted_data, fp, indent=2)
生成的JSON内容示例:
[ { "chapter": 1, "range": [ 1, 7 ] }, { "chapter": 2, "range": [ 8, 293 ] } ]
内容的提问来源于stack exchange,提问作者hbhutta
相关产品推荐
相关产品推荐

