如何将多层嵌套字典数据解码为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
相关产品推荐
相关产品推荐

