如何用Python jsons库递归为指定类型JSON对象添加自定义字段
解决jsons库自定义序列化器无限递归问题
你的代码陷入无限递归的核心原因是:给MyFoo类型设置自定义序列化器后,在序列化器内部又调用jsons.dump(obj),而这个dump会再次触发你刚注册的自定义序列化器,形成循环调用。
要解决这个问题,你需要先获取jsons对MyFoo的默认序列化器,用它生成基础的JSON结构,再在这个基础上添加自定义字段,这种方式也能天然支持嵌套的MyFoo对象序列化。
修正后的代码示例
import jsons # 先获取MyFoo类型的默认序列化器 default_foo_serializer = jsons.get_serializer(MyFoo) def custom_foo_serializer(obj, **kwargs): # 用默认序列化器生成基础JSON base_json = default_foo_serializer(obj, **kwargs) # 添加自定义字段 base_json['foo'] = "bar" return base_json # 注册自定义序列化器 jsons.set_serializer(custom_foo_serializer, MyFoo) # 正常序列化数据(支持嵌套MyFoo对象) json_result = jsons.dump(data, ensure_ascii=True)
原理说明
jsons.get_serializer(MyFoo)会获取到jsons原本用于序列化MyFoo的默认逻辑(通常是将对象属性转为字典),这个默认序列化器不会触发你自定义的逻辑,因此不会产生递归。- 在自定义序列化器中,先通过默认逻辑得到基础JSON字典,再追加自定义字段,既保留了原对象的序列化内容,又添加了需要的字段。
- 嵌套的
MyFoo对象在序列化时,每个对象都会被这个自定义序列化器处理,自动完成基础序列化+字段追加的流程,无需额外处理嵌套场景。
内容的提问来源于stack exchange,提问作者Krever
相关产品推荐
相关产品推荐

