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

如何阻止Python的json.dump将整数0转换为字符串?

解决EasyDict中GPU_ID被JSON序列化为字符串的问题

我之前也碰到过一模一样的情况!大概率是这两个原因:要么你的GPU_ID在EasyDict里实际存储的就是字符串类型(比如从命令行、文本配置读取时没转类型),要么是JSON序列化的默认行为没处理好EasyDict的特殊情况。给你几个不用手动改JSON文件的解决办法:

1. 先确认并修正EasyDict中GPU_ID的类型

先排查最基础的问题——检查GPU_ID的实际类型:

print(type(config.GPU_ID))

如果输出是<class 'str'>,那直接把它转成整数再存到EasyDict里:

config.GPU_ID = int(config.GPU_ID)

之后再调用json.dump,就能得到整数类型的0了。

2. 自定义JSON编码器自动处理类型

如果确认GPU_ID本来就是整数,但序列化后还是变成字符串,可能是EasyDict的子类特性导致JSON序列化时的类型识别问题。这时候可以写个自定义编码器,强制处理GPU_ID的类型:

import json
from easydict import EasyDict

class ConfigEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, EasyDict):
            # 遍历EasyDict的键值对,对GPU_ID做特殊处理
            processed_dict = {}
            for key, value in obj.items():
                if key == "GPU_ID":
                    # 如果是字符串且是数字,转成整数;否则保持原类型
                    processed_dict[key] = int(value) if isinstance(value, str) and value.isdigit() else value
                else:
                    processed_dict[key] = value
            return processed_dict
        # 其他类型用默认序列化逻辑
        return super().default(obj)

# 序列化时指定自定义编码器
with open("your_config.json", "w") as f:
    json.dump(config, f, cls=ConfigEncoder, indent=4)

3. 读取JSON时自动转换类型(适合不想修改dump逻辑的场景)

如果不想改动序列化的代码,也可以在读取JSON文件的时候,自动把GPU_ID转成整数:

with open("your_config.json", "r") as f:
    config = EasyDict(json.load(f))

# 读取后直接转换GPU_ID的类型
config.GPU_ID = int(config.GPU_ID)

这样每次读取后自动处理,完全不用手动修改JSON文件里的引号。

补充说明

EasyDict本质是Python dict的子类,它本身不会自动转换值的类型。很多时候GPU_ID变成字符串,是因为你最初赋值的时候(比如从命令行参数、文本配置读取)拿到的就是字符串,存到EasyDict里没做类型转换,所以序列化后自然是字符串。最好的习惯是在把值存入EasyDict之前,就确保它是你需要的整数类型。

内容的提问来源于stack exchange,提问作者xtr33me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:28:07