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

含类数组属性的Python类转JSON报TypeError:原因解析

解决Python类转JSON时的"TypeError: Object of type 'type' is not JSON serializable"错误

问题原因

你碰到的错误核心有两个:

  1. 传入了类本身而非实例:创建classToJson实例时,你给objects1传的是[object1]——这里的object1是类的类型(type对象),不是类的实例。JSON序列化器根本不知道如何处理类这种类型,直接触发报错。
  2. 自定义类实例无法默认序列化:哪怕是objects2的实例,JSON模块也没有内置规则把它转换成JSON格式的字典,同样会序列化失败。

解决方案

我们针对这两个问题逐个处理,同时优化序列化逻辑:

1. 正确创建类实例

对于object1,你需要创建它的实例而非直接传入类本身:把[object1]改成[object1()],这样传入的是包含类实例的列表,而非类类型。

2. 自定义JSON序列化逻辑

有两种通用方式让自定义类实例支持序列化:

  • 方式一:给自定义类添加to_dict()方法,手动返回实例的字典形式
  • 方式二:自定义JSON编码器类,继承json.JSONEncoder重写default方法(更灵活,推荐用这个)

修改后的完整代码示例

import json

# 自定义JSON编码器,处理自定义类实例
class CustomJSONEncoder(json.JSONEncoder):
    def default(self, obj):
        # 处理object1和objects2的实例
        if isinstance(obj, (object1, objects2)):
            # 对于object1的类属性,实例__dict__里没有,单独提取
            if isinstance(obj, object1):
                return {"value1": obj.value1, "value2": obj.value2}
            # objects2的实例直接返回__dict__(包含实例属性)
            return obj.__dict__
        # 其他类型交给父类默认处理
        return super().default(obj)

class object1():
    value1 = 1
    value2 = 0

class objects2:
    def __init__(self, name, value):
        self.name = name
        self.value = value

class classToJson():
    def __init__(self, name, image, objects1, objects2_list):
        self.name = name
        self.image = image
        self.boolean = True
        self.objects1 = objects1
        self.objects2 = objects2_list
    
    def __repr__(self):
        # 使用自定义编码器完成序列化
        return json.dumps(self.__dict__, cls=CustomJSONEncoder)

# 示例使用
name = "demo"
image = "demo_img.png"
# 创建object1的实例列表
obj1_list = [object1()]
# 创建objects2的实例列表
obj2_list = [objects2("item1", "val1"), objects2("item2", "val2")]

parsedObject = classToJson(name, image, obj1_list, obj2_list)
# 用with语句操作文件,自动关闭更安全
with open(f"{name}.json", "w") as file:
    file.write(f"[{parsedObject.__repr__()}]")

最终生成的JSON结构

运行后生成的文件内容完全符合你的预期:

[ { "name": "demo", "image": "demo_img.png", "boolean": true, "objects1": [ { "value1": 1, "value2": 0 } ], "objects2": [ { "name": "item1", "value": "val1" }, { "name": "item2", "value": "val2" } ] } ]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:14:12