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

Python自定义JSON编码器报错dict无法序列化为JSON的问题咨询

问题原因

  • 第一:CustomEncoder的default方法逻辑错误。json.JSONEncoder的default是内置序列化规则无法处理对象时才会调用的兜底回调,你在回调中将Klass实例转为dict后,应该直接返回转换后的dict,而不是调用父类的default方法。父类JSONEncoder的default默认实现不会处理任何类型,无论你传入什么都会直接抛出TypeError,这就是你看到“dict类型无法JSON序列化”离谱报错的原因。
  • 第二:自定义__dict__方法属于错误实践。Python中类实例的__dict__是内置特殊属性,存储实例的所有可写成员,你自定义同名方法会覆盖原生属性,容易引发不可预期的问题,建议改为普通方法如to_dict。

修复后可运行代码

import json

class Klass():
    def __init__(self, number):
        self.number = number

    # 替换自定义的__dict__方法为普通命名方法
    def to_dict(self):
        return {"number": self.number}

class CustomEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Klass):
            # 转换后直接返回结果,编码器会自动序列化返回的dict
            return obj.to_dict()
        # 非目标类型走父类兜底逻辑
        return super().default(obj)

# 之前报错的用例现在可正常运行
print(json.dumps(Klass(10), cls=CustomEncoder))
print(json.dumps({"Test":Klass(10)}, cls=CustomEncoder))

补充说明

你之前那几个正常运行的测试用例,传入的都是JSON原生支持的dict类型,编码器直接用内置规则处理了,根本没有走到你写的default方法,所以没有触发错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 23:45:08