You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

序列化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:40:22