添加indent参数序列化dataclass为JSON时出现IntervalStrategy不可序列化错误
解决dataclass序列化JSON加indent报错的问题
问题根源
你注释掉了super().default(o)这行代码,导致自定义Encoder遇到非dataclass的不可序列化对象(比如IntervalStrategy)时,无法交给父类的默认处理逻辑,直接抛出错误。不加indent时可能因序列化路径差异没触发问题,但加indent后这个漏洞就暴露了。
解决步骤
1. 恢复父类默认方法调用
先取消return super().default(o)的注释,让Encoder能处理非dataclass的标准可序列化对象。
2. 新增自定义类型的序列化逻辑
针对IntervalStrategy这类自定义类型,在Encoder的default方法里添加判断,把它转换成JSON可识别的类型(比如字符串、字典)。
完整代码示例
import json from dataclasses import dataclass, is_dataclass from enum import Enum # 假设IntervalStrategy是枚举类(根据实际结构调整) class IntervalStrategy(Enum): STEP = "step" EPOCH = "epoch" @dataclass class Model_args: x: str strategy: IntervalStrategy model_args = Model_args(x="bar", strategy=IntervalStrategy.STEP) class EnhancedJSONEncoder(json.JSONEncoder): def default(self, o): if is_dataclass(o): return dataclasses.asdict(o) # 处理IntervalStrategy类型 if isinstance(o, IntervalStrategy): return o.value # 也可返回o.name,按需选择 # 交给父类处理其他未覆盖的类型 return super().default(o) # 带indent格式化序列化 model_json = json.dumps(model_args, cls=EnhancedJSONEncoder, indent=4) # 保存到文件 with open("model_args.json", "w") as f: f.write(model_json)
验证结果
执行后生成的JSON文件内容会是格式化后的结构:
{ "x": "bar", "strategy": "step" }
如果IntervalStrategy是普通类而非枚举,可根据其属性结构调整序列化逻辑,比如:
if isinstance(o, IntervalStrategy): return {"interval_type": o.type, "interval_value": o.value}
内容的提问来源于stack exchange,提问作者4daJKong
相关产品推荐
相关产品推荐

