如何阻止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
相关产品推荐
相关产品推荐

