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

如何将JSON数据转换为Python类?嵌套类属性赋值问题求助

如何将JSON数据转换为Python类?

用户代码示例:

class AnotherClass():
    test: int

class MyClass():
    a: int
    c: AnotherClass


json_data = {
    "a": 1,
    "c": {
        "test": 2
    }
}

my_class = MyClass(json_data)
print(my_class.a) # 1
print(my_class.c.test) # 报错

尝试用__dict__直接赋值后,嵌套类变量无法被正确解析:

class MyClass():
    a: int
    c: AnotherClass

    def __init__(self, json) -> None:
        self.__dict__ = json

my_class = MyClass(json_data)
print(my_class.a) # 1
print(my_class.c.test) # AttributeError: 'dict' object has no attribute 'test'

需求:无需手动逐个赋值,自动解析JSON并将数据映射到嵌套类的变量中。


方法1:纯Python递归解析(无依赖)

写一个通用转换函数,根据类的类型注解递归将字典转为对应类实例:

class AnotherClass():
    test: int

class MyClass():
    a: int
    c: AnotherClass

def dict_to_class(data, cls):
    instance = cls()
    for attr, value in data.items():
        attr_type = cls.__annotations__.get(attr)
        if attr_type and isinstance(value, dict):
            # 若属性为类类型且对应值是字典,递归转换
            setattr(instance, attr, dict_to_class(value, attr_type))
        else:
            setattr(instance, attr, value)
    return instance

json_data = {
    "a": 1,
    "c": {
        "test": 2
    }
}

my_class = dict_to_class(json_data, MyClass)
print(my_class.a) # 1
print(my_class.c.test) # 2

方法2:使用标准库dataclasses(Python3.7+)

借助dataclasses的结构化定义,配合递归函数实现嵌套转换:

from dataclasses import dataclass

@dataclass
class AnotherClass:
    test: int

@dataclass
class MyClass:
    a: int
    c: AnotherClass

def dataclass_from_dict(data, cls):
    kwargs = {}
    for field, field_type in cls.__annotations__.items():
        value = data.get(field)
        if hasattr(field_type, '__annotations__') and isinstance(value, dict):
            kwargs[field] = dataclass_from_dict(value, field_type)
        else:
            kwargs[field] = value
    return cls(**kwargs)

json_data = {
    "a": 1,
    "c": {
        "test": 2
    }
}

my_class = dataclass_from_dict(json_data, MyClass)
print(my_class.a) # 1
print(my_class.c.test) # 2

方法3:使用第三方库pydantic(推荐)

pydantic专门处理数据验证与类-字典/JSON转换,自动支持嵌套解析:

from pydantic import BaseModel

class AnotherClass(BaseModel):
    test: int

class MyClass(BaseModel):
    a: int
    c: AnotherClass

json_data = {
    "a": 1,
    "c": {
        "test": 2
    }
}

my_class = MyClass(**json_data)
# 也可以用 parse_obj 方法:my_class = MyClass.parse_obj(json_data)
print(my_class.a) # 1
print(my_class.c.test) # 2
# 直接解析JSON字符串:MyClass.parse_raw(json_str)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 07:10:31