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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:42:01