Pydantic如何为名称不同的JSON属性和模型字段设置映射解析
Pydantic 字段与JSON键名不一致的映射方案
问题原因:Pydantic默认仅会匹配与模型字段名完全相同的JSON键,你当前没有给thumbnail字段指定和JSON键thumbnailUrl的映射关系,所以解析时thumbnail会保留默认值None。
Pydantic V2 解法(当前主流版本)
单个字段手动指定别名
使用Field的alias参数为字段指定对应JSON键名:
from pydantic import BaseModel, Field from typing import Optional class ChatMessageAttachment(BaseModel): id: str # alias参数填写JSON中对应的键名 thumbnail: Optional[str] = Field(None, alias="thumbnailUrl") external_data = {"id": "123", "thumbnailUrl": "www.google.es"} # 用model_validate方法解析,可自动识别别名 chat_message = ChatMessageAttachment.model_validate(external_data) print(chat_message) # >>> id='123' thumbnail='www.google.es'
如果需要支持**解包传参的方式也能识别别名,可在模型配置中开启populate_by_name:
class ChatMessageAttachment(BaseModel): model_config = {"populate_by_name": True} id: str thumbnail: Optional[str] = Field(None, alias="thumbnailUrl") # 此时直接解包也可正常解析 chat_message = ChatMessageAttachment(**external_data)
批量自动映射(适合驼峰转蛇形等统一规则场景)
如果所有JSON键都是驼峰命名,模型字段都是蛇形命名,不用逐个指定别名,用AliasGenerator批量处理:
from pydantic import BaseModel, ConfigDict, AliasGenerator from pydantic.alias_generators import to_camel class ChatMessageAttachment(BaseModel): model_config = ConfigDict( alias_generator=to_camel, # 自动将模型蛇形字段转换为驼峰作为别名 populate_by_name=True ) id: str thumbnail: Optional[str] = None # 自动映射JSON中的thumbnailUrl
Pydantic V1 解法
逻辑和V2基本一致,仅配置项和方法名有差异:
from pydantic import BaseModel, Field from typing import Optional class ChatMessageAttachment(BaseModel): class Config: allow_population_by_field_name = True # 对应V2的populate_by_name id: str thumbnail: Optional[str] = Field(None, alias="thumbnailUrl") external_data = {"id": "123", "thumbnailUrl": "www.google.es"} # 两种解析方式都可用 chat_message = ChatMessageAttachment.parse_obj(external_data) # 对应V2的model_validate chat_message = ChatMessageAttachment(**external_data)
内容的提问来源于stack exchange,提问作者Javi
相关产品推荐
相关产品推荐

