Python3中如何将JSON反序列化为指定自定义类的对象结构
Python 3 将JSON反序列化为指定自定义对象的实现方法
JSON默认的json.load方法只会将JSON结构转换为字典、列表、基础值类型,不会自动映射到你定义的自定义类实例,你可以通过以下两种方案实现指定类型的反序列化:
方案1:原生Python实现(无第三方依赖)
你可以手动处理嵌套结构的类型转换,配合Python 3.7+内置的dataclass可以省去手写构造函数的冗余代码:
import json from dataclasses import dataclass # 先调整自定义类,添加构造逻辑 @dataclass class B: # 注意示例JSON中field1为字符串类型,和你原注解的int不匹配,需调整 field1: str field2: str @dataclass class C: field1: str field2: str @dataclass class A: name: str some_object: B some_list_of_objects: list[C] @classmethod def load_from_json(cls, file_path: str): # 先加载JSON为基础结构 with open(file_path, "r", encoding="utf-8") as f: raw_data = json.load(f) # 手动转换嵌套结构为对应类实例 b_instance = B(**raw_data["some_object"]) c_instance_list = [C(**item) for item in raw_data["some_list_of_objects"]] # 构造并返回A类实例 return cls( name=raw_data["name"], some_object=b_instance, some_list_of_objects=c_instance_list ) # 调用示例 a_instance = A.load_from_json("你的JSON文件路径.json") # 验证类型 print(type(a_instance.some_object)) # 输出 <class '__main__.B'> print(type(a_instance.some_list_of_objects[0])) # 输出 <class '__main__.C'>
注意:如果你的实际JSON字段值和类注解类型不匹配,转换会报错,请提前对齐类型定义。
方案2:使用Pydantic自动反序列化(推荐复杂场景使用)
如果你的JSON结构嵌套层级多、字段复杂,可以用Pydantic库自动完成类型映射和校验,省去手动写转换逻辑的成本:
- 先安装依赖:
pip install pydantic - 代码实现:
import json from pydantic import BaseModel class B(BaseModel): field1: str field2: str class C(BaseModel): field1: str field2: str class A(BaseModel): name: str some_object: B some_list_of_objects: list[C] # 方式1:先加载JSON再构造实例 with open("你的JSON文件路径.json", "r", encoding="utf-8") as f: raw_data = json.load(f) a_instance = A(**raw_data) # 方式2:直接调用parse_file方法一步完成 a_instance = A.parse_file("你的JSON文件路径.json")
Pydantic会自动根据你定义的类型注解完成嵌套结构的类型转换,同时自带类型校验,出现类型不匹配时会抛出清晰的错误提示。
内容的提问来源于stack exchange,提问作者Z .
相关产品推荐
相关产品推荐

