如何将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
相关产品推荐
相关产品推荐

