Python多层嵌套类实例转字典及JSON序列化存储问题咨询
多层嵌套类实例JSON序列化/反序列化解决方案
以下两种方案都支持任意深度的嵌套类,不需要手动逐层转换,可直接完成序列化存储和反向还原:
方案1:Python标准库实现(无额外依赖)
通过递归函数处理类实例转换,仅需提前注册用到的自定义类即可:
核心代码
import json # 递归将类实例转为可序列化字典 def instance_to_dict(obj): # 处理基础类型 if isinstance(obj, (int, float, str, bool, type(None))): return obj # 处理列表 if isinstance(obj, list): return [instance_to_dict(item) for item in obj] # 处理字典 if isinstance(obj, dict): return {k: instance_to_dict(v) for k, v in obj.items()} # 处理自定义类实例 if hasattr(obj, '__dict__'): obj_dict = {k: instance_to_dict(v) for k, v in obj.__dict__.items()} # 标记类名用于反序列化 obj_dict['__class__'] = obj.__class__.__name__ return obj_dict raise TypeError(f"不支持的类型: {type(obj)}") # 注册所有用到的自定义类,新增嵌套类只需在这里加一行 CLASS_MAPPING = { "Class1": Class1, "Class2": Class2 } # 递归将字典转回类实例 def dict_to_instance(obj): if isinstance(obj, list): return [dict_to_instance(item) for item in obj] if isinstance(obj, dict): if "__class__" in obj: class_name = obj.pop("__class__") cls = CLASS_MAPPING[class_name] # 递归处理属性后实例化 init_kwargs = {k: dict_to_instance(v) for k, v in obj.items()} return cls(**init_kwargs) return {k: dict_to_instance(v) for k, v in obj.items()} return obj
使用示例
# 序列化写入JSON文件 with open("data.json", "w", encoding="utf-8") as f: serializable_data = instance_to_dict(exterior_class) json.dump(serializable_data, f, indent=2) # 从文件读取反序列化为类实例 with open("data.json", "r", encoding="utf-8") as f: loaded_data = json.load(f) loaded_instance = dict_to_instance(loaded_data) # 验证嵌套属性正常 print(loaded_instance.data.x) # 输出 5,和原实例一致
方案2:jsonpickle第三方库实现(代码量最少)
适合允许引入第三方依赖的场景,完全自动处理任意深度的嵌套结构,不需要手动写转换逻辑:
- 安装依赖:
pip install jsonpickle - 使用代码:
import jsonpickle # 序列化写入文件 with open("data.json", "w", encoding="utf-8") as f: json_str = jsonpickle.encode(exterior_class, indent=2) f.write(json_str) # 反序列化读取 with open("data.json", "r", encoding="utf-8") as f: loaded_instance = jsonpickle.decode(f.read()) # 验证 print(loaded_instance.data.y) # 输出 10,和原实例一致
注意事项
- 方案1如果遇到自定义类的
__init__参数和实例属性名不匹配的情况,需要单独调整初始化逻辑 - 反序列化时不要处理来源不明的JSON文件,避免执行恶意代码
内容的提问来源于stack exchange,提问作者XANDER
相关产品推荐
相关产品推荐

