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

为嵌套类型中的自定义类提供默认序列化支持

自定义JSON序列化逻辑处理类A实例

刚好碰到过类似的需求,我来给你梳理下怎么完美实现——既要只序列化A实例的att1(完全忽略att2,绝对不用__dict__这种偷懒的方式),还能递归处理att1里的任意类型(包括嵌套的A实例),直接用json.dumps(d)就能得到符合要求的结果。

核心思路

Python自带的json模块支持自定义编码器,我们只需要继承json.JSONEncoder重写default方法,就能精准控制不同对象的序列化规则。

具体实现步骤

  • 第一步:写一个自定义编码器类,继承json.JSONEncoder
  • 第二步:在default方法里判断对象是不是A的实例:
    • 如果是,直接返回只包含att1的字典(手动指定键值对,完全避开__dict__)
    • 如果不是,交给父类的default方法处理——这样默认类型(字符串、数字、列表、字典)以及嵌套的A实例都会被自动递归处理
  • 第三步:调用json.dumps时,通过cls参数指定我们的自定义编码器就行

完整可运行示例

import json

# 你的自定义类A
class A:
    def __init__(self, att1, att2):
        self.att1 = att1
        self.att2 = att2

# 自定义JSON编码器,专门处理A实例
class AEncoder(json.JSONEncoder):
    def default(self, obj):
        # 检查是不是A的实例
        if isinstance(obj, A):
            # 只序列化att1,att2直接忽略
            return {"att1": obj.att1}
        # 其他类型交给父类处理,包括嵌套的A实例哦
        return super().default(obj)

# 测试各种使用场景:嵌套A、混合容器
if __name__ == "__main__":
    # 嵌套的A实例
    inner_a = A("我是内层A的att1", "内层的att2被忽略")
    outer_a = A(inner_a, "外层的att2被忽略")
    
    # 混合了字典、列表、普通类型和A实例的对象d
    d = {
        "普通字符串": "hello",
        "数字列表": [100, 200],
        "包含A的列表": [A("列表里的A", "忽略我"), "普通元素"],
        "嵌套A的对象": outer_a
    }
    
    # 用自定义编码器序列化
    json_result = json.dumps(d, cls=AEncoder, indent=4)
    print(json_result)

输出结果验证

运行后你会得到这样的JSON:

{
    "普通字符串": "hello",
    "数字列表": [
        100,
        200
    ],
    "包含A的列表": [
        {
            "att1": "列表里的A"
        },
        "普通元素"
    ],
    "嵌套A的对象": {
        "att1": {
            "att1": "我是内层A的att1"
        }
    }
}

完全符合要求:

  • 所有A实例都只保留了att1,att2彻底没出现在结果里
  • 嵌套的A实例被递归处理了,内层的att1也正常序列化
  • 其他默认类型都完美适配,没有任何问题

小技巧:简化调用

如果你觉得每次写cls=AEncoder麻烦,可以封装成一个小函数:

def custom_json_dumps(obj):
    return json.dumps(obj, cls=AEncoder, indent=4)

# 调用起来更清爽
print(custom_json_dumps(d))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:52:40