使用Pydantic解析嵌套JSON时如何跳过层级直接提取enabled布尔值
可以实现,不需要为每个子字段单独定义Pydantic类,有两种常用的实现方案:
方案1:预处理JSON数据
先把API返回的嵌套结构拍平为和模型属性一一对应的键值对,再传入模型实例化,适合只在单一场景解析该数据的情况:
import json # 第一步:解析API返回的JSON为字典 response_dict = json.loads(你的API响应字符串) raw_features = response_dict["features"] # 第二步:拍平处理嵌套结构 processed_features = {} for key, value in raw_features.items(): if key == "due_dates": # due_dates下的字段直接对应模型属性,直接合并 processed_features.update(value) else: # 其他字段统一取enabled值 processed_features[key] = value["enabled"] # 第三步:实例化模型 features = Features(**processed_features)
方案2:模型内新增前置验证器
把拍平逻辑写到Pydantic模型内部,自动处理输入数据,适合多处需要解析该结构的场景,复用性更高:
from pydantic import BaseModel, model_validator from typing import Any class Features(BaseModel): multiple_assignees: bool = False start_date: bool = False remap_due_dates: bool = False remap_closed_due_date: bool = False time_tracking: bool = False tags: bool = False time_estimates: bool = False checklists: bool = False custom_fields: bool = False remap_dependencies: bool = False dependency_warning: bool = False portfolios: bool = False points: bool = False custom_items: bool = False zoom: bool = False milestones: bool = False emails: bool = False @model_validator(mode="before") @classmethod def flatten_nested_features(cls, data: Any) -> Any: if not isinstance(data, dict): return data flattened = {} for key, value in data.items(): if key == "due_dates": flattened.update(value) else: # 取不到enabled时默认返回False,兼容异常情况 flattened[key] = value.get("enabled", False) return flattened
使用时直接传入API返回的features字段即可:
response_dict = json.loads(你的API响应字符串) features = Features(**response_dict["features"])
如果你使用的是Pydantic v1版本,将
@model_validator(mode="before")替换为@root_validator(pre=True)即可,逻辑部分无需修改。
模型中定义的默认值会自动生效,比如JSON未返回的time_tracking字段会默认赋值为False,无需额外处理。
内容的提问来源于stack exchange,提问作者Zach Johnson
相关产品推荐
相关产品推荐

