Python 3.11自定义对象JSON序列化失败,请求实现目标结构
解决自定义Student/Team对象的JSON序列化问题
错误的核心原因是:Python标准库的json模块默认只能序列化内置类型(如字典、列表、字符串等),无法直接处理自定义类的实例(比如你的Student对象)。以下是三种可行的解决方案:
方法1:自定义JSON编码器
通过继承json.JSONEncoder并重写default方法,告诉序列化器如何处理自定义对象:
import json class Student(): def __init__(self): pass class Team(): def __init__(self): pass # 自定义JSON编码器 class CustomJSONEncoder(json.JSONEncoder): def default(self, obj): # 如果是Student或Team实例,返回其属性字典 if isinstance(obj, (Student, Team)): return obj.__dict__ # 其他类型交给父类处理 return super().default(obj) # 创建实例 student1 = Student() student1.first_name='Geeky' student1.last_name='Guy' student2 = Student() student2.first_name='GFG' student2.last_name='ocks' team = Team() team.name='One' team.quantity=2 team.students=[student1, student2] # 序列化时指定自定义编码器 json_data = json.dumps(team, cls=CustomJSONEncoder) print(json_data)
方法2:给类添加to_dict方法
在自定义类中实现to_dict方法,手动定义对象转字典的规则,灵活性更高:
import json class Student(): def __init__(self): pass def to_dict(self): return { "first_name": self.first_name, "last_name": self.last_name } class Team(): def __init__(self): pass def to_dict(self): return { "name": self.name, "quantity": self.quantity, "students": [s.to_dict() for s in self.students] } # 创建实例 student1 = Student() student1.first_name='Geeky' student1.last_name='Guy' student2 = Student() student2.first_name='GFG' student2.last_name='ocks' team = Team() team.name='One' team.quantity=2 team.students=[student1, student2] # 调用to_dict后序列化 json_data = json.dumps(team.to_dict()) print(json_data)
方法3:使用dataclass(Python3.7+推荐,适配3.11)
利用Python3.7+引入的dataclass,可以自动生成对象转字典的逻辑,代码更简洁:
import json from dataclasses import dataclass, asdict @dataclass class Student: first_name: str last_name: str @dataclass class Team: name: str quantity: int students: list[Student] # 创建实例(无需手动赋值属性,更简洁) student1 = Student(first_name='Geeky', last_name='Guy') student2 = Student(first_name='GFG', last_name='ocks') team = Team(name='One', quantity=2, students=[student1, student2]) # 用asdict转换为字典后序列化 json_data = json.dumps(asdict(team)) print(json_data)
三种方法都能输出你需要的目标JSON结构,可根据场景选择:
- 若无法修改原有类结构,选方法1;
- 若需要精确控制序列化字段,选方法2;
- 若为新项目编写代码,推荐方法3,代码更简洁易维护。
内容的提问来源于stack exchange,提问作者Pampayacu
相关产品推荐
相关产品推荐

