如何为含嵌套父子关系的复杂JSON文件构建Pydantic模型?
带父子关系的JSON结构与Pydantic模型构建
JSON结构说明
我有一个包含多类带父子关系对象的JSON文件,其结构如下:
{"objectType1": { "objectType1ID1": { "parent": {}, "children": [{"id":"objectType2ID2"}], "properties": {} }, "objectType1ID2": { "parent": {}, "children": [{}], "properties": {} } }, "objectType2": { "objectType2ID1": { "parent": {}, "children": [], "properties": {} }, "objectType2ID2": { "parent": {"id":"objectType1ID1"}, "children": [], "properties": {} } } }
该结构的核心规则:
- 第一级键为对象类型,每个类型下是该类型的对象集合(键为对象ID)
- 每个对象包含
parent、children(数组)、properties三个字段 - 每个对象最多对应一个父对象,子对象以列表形式存储
现有代码瓶颈
我尝试为该结构构建Pydantic模型,目前的代码如下,但存在适配问题:
from pydantic import BaseModel from typing import List, Optional class ObjectParent(BaseModel): id: Optional[str] class ObjectChild(BaseModel): id: Optional[str] class Properties(BaseModel): name: Optional[str] description: Optional[str] class Object(BaseModel): id: str parent: Optional['ObjectParent'] = None children: List['ObjectChild'] = [] properties: Properties
修正后的Pydantic模型方案
现有代码的主要问题:
- 无需单独定义
ObjectParent和ObjectChild,二者都是仅含id的引用结构,可统一处理 - 未匹配顶层“对象类型→对象字典”的映射结构
Object中的id字段多余,JSON中对象ID是外层字典的键,而非对象内部字段
以下是完全适配该JSON结构的模型:
from pydantic import BaseModel from typing import List, Optional, Dict # 父/子对象的引用结构 class ObjectRef(BaseModel): id: Optional[str] = None # 对象属性结构,可根据实际需求扩展字段 class Properties(BaseModel): name: Optional[str] = None description: Optional[str] = None # 单个对象的结构 class ObjectItem(BaseModel): parent: ObjectRef = ObjectRef() # 默认空父引用 children: List[ObjectRef] = [] # 默认空子对象列表 properties: Properties = Properties() # 默认空属性 # 顶层JSON结构:键为对象类型,值为该类型的对象字典 class ObjectHierarchy(BaseModel): __root__: Dict[str, Dict[str, ObjectItem]]
关键说明
ObjectRef统一处理父对象和子对象的ID引用,适配JSON中parent为空对象、children包含空白对象的情况ObjectItem对应JSON中的单个对象,设置默认值确保空结构能正常解析- 使用
__root__字段处理顶层动态的对象类型键,直接将整个JSON解析为ObjectHierarchy实例
使用示例
import json # 加载JSON文件 with open("your_object_data.json", "r") as f: json_content = json.load(f) # 解析到模型 hierarchy = ObjectHierarchy(**json_content) # 访问示例:获取objectType1下的objectType1ID1对象 target_obj = hierarchy.__root__["objectType1"]["objectType1ID1"] print(target_obj.parent.id) # 输出: None print(target_obj.children[0].id) # 输出: objectType2ID2
内容的提问来源于stack exchange,提问作者hailnick
相关产品推荐
相关产品推荐

