Python自定义JSON编码器无法捕获列表分支问题求解
问题分析与解决方案
问题原因
json.JSONEncoder的default方法不会接收整个列表作为参数,它会遍历列表中的每个元素,逐个调用default处理单个元素。所以你代码里的isinstance(obj, list)判断永远不会触发——传入default的都是单个Container对象,而非整个列表。另外,你返回字典时用了全局变量ContainerStore,这也是错误的,应该处理当前传入的对象。
修正后的代码
import json class ContainerEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, Container): # 处理单个Container,同时递归处理prop里的嵌套结构 return { obj.get_name(): { "prop": self.encode(obj.get_prop()), # 手动调用encode触发递归 "desc": obj.get_desc() } } # 其他类型交给默认编码器处理 return super().default(obj) class Container: def __init__(self, name: str, prop: any = None, desc: str = ""): self._name = name self._prop = prop self._desc = desc def get_name(self): return self._name def get_prop(self): return self._prop def get_desc(self): return self._desc # 测试嵌套场景 C4 = Container("NestedContainer", [Container("Sub1", 5), Container("Sub2", "test")], "嵌套Container列表") C1 = Container("Container1", 12, "Container Holding a Number") C2 = Container("Container2", True, "Container Holding a Boolean Value") C3 = Container("CoolContainer", [1, 2, 3, 4], "Container Holding a List") ContainerStore = [C1, C2, C3, C4] # 把Container列表转换为目标字典后序列化 def container_list_to_dict(container_list): return {x.get_name(): {"prop": x.get_prop(), "desc": x.get_desc()} for x in container_list} dump1 = json.dumps(container_list_to_dict(ContainerStore), cls=ContainerEncoder) print(dump1) # 直接序列化单个含嵌套的Container dump3 = json.dumps(C4, cls=ContainerEncoder) print(dump3)
关键修改点
- 移除无效的
list判断分支,专注处理Container对象 - 手动调用
self.encode(obj.get_prop())触发递归,确保嵌套的Container或列表能被正确处理 - 新增辅助函数
container_list_to_dict,专门负责把Container列表转换为目标字典,避免依赖全局变量 - 添加嵌套
Container测试场景,验证递归处理效果
内容的提问来源于stack exchange,提问作者Uuruurrgh
相关产品推荐
相关产品推荐

