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

如何解决Pydantic BaseModel中Enum类调用dict()时JSON序列化报错

报错原因

BaseModel.dict() 方法默认会将Enum类型的字段直接返回Enum实例对象,而非实例对应的实际值,requests库内置的JSON序列化器无法直接识别序列化Enum对象,因此触发类型错误。

解决方案

以下三种方案可按你的业务场景选择:

方案1:调用dict时添加序列化参数(无需修改现有定义,单次生效)

调用dict()方法时传入use_enum_values=True参数,Pydantic会自动将所有Enum字段的值替换为对应的枚举值返回:

# 修改后可正常运行
resp: Response = requests.post('https://postman-echo.com/post', json=my_dog.dict(use_enum_values=True))
print(resp.json())

该方案支持Pydantic V1、V2版本,无需调整现有类定义,适合临时需要调整序列化逻辑的场景。

方案2:定义Enum时继承str类型(全局生效,兼容性最好)

修改枚举类的定义,让其同时继承str类,此时枚举实例本身就是字符串子类,可直接被JSON序列化器识别:

# 修改枚举类定义,增加str父类
class PetType(str, Enum):
    DOG: str = 'dog'
    CAT: str = 'cat'

修改后无需调整任何调用dict()的代码,原有逻辑可直接运行,该方案兼容所有需要序列化Enum的场景,Python 3.11+内置的StrEnum本质也是相同的实现逻辑。

方案3:自定义处理字典枚举值(适用于无法修改类定义的场景)

如果既不能修改枚举/模型定义,也不能调整dict()调用参数,可以手动遍历字典替换所有Enum实例为对应值:

from enum import Enum

def serialize_enum_values(data: dict) -> dict:
    for k, v in data.items():
        if isinstance(v, Enum):
            data[k] = v.value
        # 如果有嵌套字典/列表可自行拓展递归逻辑
    return data

resp: Response = requests.post('https://postman-echo.com/post', json=serialize_enum_values(my_dog.dict()))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:24:04