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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 04:34:56