含类数组属性的Python类转JSON报TypeError:原因解析
解决Python类转JSON时的"TypeError: Object of type 'type' is not JSON serializable"错误
问题原因
你碰到的错误核心有两个:
- 传入了类本身而非实例:创建
classToJson实例时,你给objects1传的是[object1]——这里的object1是类的类型(type对象),不是类的实例。JSON序列化器根本不知道如何处理类这种类型,直接触发报错。 - 自定义类实例无法默认序列化:哪怕是
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
相关产品推荐
相关产品推荐

