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

如何将多层嵌套字典数据解码为Python对象?

问题分析

Python的类型注解仅作为静态提示存在,运行时不会自动将嵌套字典转换为对应类的实例。你给B.data标注了List[A],但实际初始化时b.data里的元素还是原始字典,因此通过.访问属性会抛出AttributeError。这和Go语言反序列化时自动映射结构体的行为不同,Go会借助结构体标签完成类型转换,而Python原生不具备这个运行时能力。

解决方案

要实现类似Go的自动映射效果,有两种可行方案:

方案一:手动实现嵌套转换逻辑

修改类的初始化逻辑,对嵌套的字典列表进行显式转换:

from typing import List, Dict, Any


class A:
    field_a: int
    field_b: str

    def __init__(self, field_a: int, field_b: str):
        self.field_a = field_a
        self.field_b = field_b

    @classmethod
    def from_dict(cls, data: Dict[str, Any]) -> 'A':
        return cls(**data)


class B:
    data: List[A]

    def __init__(self, data: List[Dict[str, Any]]):
        self.data = [A.from_dict(item) for item in data]


data = {
    "data": [
        {
            "field_a": 1,
            "field_b": "a"
        }
    ]
}

b = B(**data)
print(b.data[0].field_a)  # 输出1

方案二:使用第三方库简化转换

借助pydantic这类专门处理数据验证与类型转换的库,它能自动完成字典到类实例(包括嵌套结构)的映射:

from pydantic import BaseModel
from typing import List


class A(BaseModel):
    field_a: int
    field_b: str


class B(BaseModel):
    data: List[A]


data = {
    "data": [
        {
            "field_a": 1,
            "field_b": "a"
        }
    ]
}

b = B(**data)
print(b.data[0].field_a)  # 输出1

内容的提问来源于stack exchange,提问作者Nguyễn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:18:20