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

如何将嵌套JSON拆包映射为带嵌套字段的Python Dataclass实例

嵌套JSON转Python Dataclass的实现方案

你可以通过以下两种方案实现嵌套结构的自动解析:


方案1:原生实现(无需额外依赖)

通过dataclass内置的__post_init__钩子方法,在拆包完成后自动执行嵌套字段的类型转换,无需修改原有拆包调用逻辑:

from dataclasses import dataclass
from typing import List

@dataclass
class StatusElement:
    status: str
    orderindex: int
    color: str
    type: str


@dataclass
class List:
    id: int 
    statuses: List[StatusElement]
    
    def __post_init__(self):
        # 处理基础字段类型转换(JSON中id为字符串,需转为int)
        self.id = int(self.id)
        # 遍历嵌套列表,把每个字典转换为对应的dataclass实例
        self.statuses = [StatusElement(**item) for item in self.statuses]

调用方式和你原有逻辑完全一致:

json_data = {
  "id": "124",
  "statuses": [
    {
      "status": "to do",
      "orderindex": 0,
      "color": "#d3d3d3",
      "type": "open"
    }]
}

list_obj = List(**json_data)

注:建议自定义类名尽量不要和typing.List等标准库通用命名重名,避免出现命名冲突。


方案2:第三方库实现(适合多层嵌套的复杂场景)

如果嵌套层级多、结构复杂,推荐用成熟的序列化库自动处理,省去手动写转换逻辑的成本:

可选1:dataclasses-json

安装命令:pip install dataclasses-json
只需给外层dataclass加装饰器即可自动支持嵌套解析:

from dataclasses import dataclass
from typing import List
from dataclasses_json import dataclass_json

@dataclass
class StatusElement:
    status: str
    orderindex: int
    color: str
    type: str

@dataclass_json
@dataclass
class List:
    id: int 
    statuses: List[StatusElement]

调用方式:

list_obj = List.from_dict(json_data)

可选2:Pydantic

Pydantic自带类型校验,性能更高,是目前Python领域最常用的序列化方案之一:
安装命令:pip install pydantic
代码示例:

from pydantic import BaseModel
from typing import List

class StatusElement(BaseModel):
    status: str
    orderindex: int
    color: str
    type: str

class TaskList(BaseModel):
    id: int 
    statuses: List[StatusElement]

调用方式:

list_obj = TaskList(**json_data)

内容的提问来源于stack exchange,提问作者Zach Johnson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:24:03