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

