为嵌套类型中的自定义类提供默认序列化支持
自定义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
相关产品推荐
相关产品推荐

