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
相关产品推荐
相关产品推荐

