You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为含嵌套父子关系的复杂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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 23:30:48