Python自定义类JSON序列化报TypeError错误的通用解决方案问询
解决方案
一、开箱即用的第三方库方案
1. jsonpickle(最适配需求)
这个库专门用于序列化任意Python对象到JSON格式,默认自动处理循环引用、无__dict__的对象(比如用__slots__定义的类、C扩展实现的类实例),不需要额外编写自定义适配逻辑,用法和原生json模块高度一致:
- 安装命令:
pip install jsonpickle - 使用示例:
import jsonpickle c = SomeClass() # 序列化到JSON字符串,unpicklable设为False可移除用于反序列化的元信息,仅保留字段内容 json_str = jsonpickle.encode(c, unpicklable=False) # 如需格式化输出,添加indent参数即可 json_str = jsonpickle.encode(c, unpicklable=False, indent=2)
2. pydantic(可修改自定义类定义时可选)
如果你的自定义类可以调整定义,继承pydantic的BaseModel即可直接获得序列化能力,还附带类型校验功能:
from pydantic import BaseModel class SomeClass(BaseModel): # 原有字段定义 pass c = SomeClass() json_str = c.model_dump_json(indent=2)
二、无第三方依赖的内置方案
如果不想安装额外库,可以基于dir()和getattr()编写通用序列化逻辑,可覆盖大部分无__dict__的场景:
import json from inspect import ismethod def serialize_obj(obj, seen=None): # 处理循环引用 if seen is None: seen = set() obj_id = id(obj) if obj_id in seen: return "<循环引用已跳过>" seen.add(obj_id) fields = {} # 过滤私有属性和方法,仅保留公开字段 for attr in dir(obj): if not attr.startswith('_'): value = getattr(obj, attr) if not ismethod(value): try: # 基础类型直接返回,复杂类型递归处理 json.dumps(value) fields[attr] = value except TypeError: fields[attr] = serialize_obj(value, seen=seen.copy()) return fields # 调用时传入default参数即可 json_str = json.dumps(c, default=serialize_obj, indent=2, ensure_ascii=False)
调试场景补充
如果你只是需要本地查看对象内容,不需要标准JSON格式,直接用内置pprint模块即可输出完整结构:
from pprint import pprint pprint(c)
内容的提问来源于stack exchange,提问作者John Sohn
相关产品推荐
相关产品推荐

