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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 23:07:41