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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 05:24:00