如何使用Pydantic校验大型嵌套JSON中的少量指定字段
错误原因
你当前的写法存在逻辑冲突:
- 你给
short_address字段设置了别名为name,Pydantic实例化时会优先从传入的顶层字典中查找name键,你的输入数据顶层没有该键,会直接触发字段缺失错误 - 单个字段的
pre=True校验器只有在Pydantic成功定位到对应字段的输入值之后才会执行,因此你写的嵌套提取逻辑根本没有机会运行
可行解决方案
方案1:根校验器实现(兼容Pydantic v1、v2全版本)
使用根校验器直接处理完整的输入字典,主动提取嵌套路径的字段值:
import pydantic from typing import Dict class OfferById(pydantic.BaseModel): short_address: str @pydantic.root_validator(pre=True) def extract_nested_value(cls, values: Dict): try: values["short_address"] = values["json_data_feed"]["address"]["name"] except KeyError as e: raise ValueError(f"嵌套路径缺失必要字段: {e}") return values # 正常实例化 some = OfferById(**data) print(some.short_address) # 输出:home_sweet_home
方案2:Pydantic v2专属原生嵌套路径匹配
如果你使用Pydantic v2,可以直接用AliasPath指定嵌套查找路径,无需额外写校验逻辑:
from pydantic import BaseModel, Field, AliasPath class OfferById(BaseModel): short_address: str = Field(validation_alias=AliasPath("json_data_feed", "address", "name")) # 正常实例化 some = OfferById(**data)
如果需要处理路径不存在的兼容场景,给字段加Optional类型和默认值即可。
内容的提问来源于stack exchange,提问作者Степанов Александр
相关产品推荐
相关产品推荐

