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

添加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 12:33:21