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

如何将Student类对象数组转换为指定格式的JSON?

问题:Python Student类转JSON无法得到预期嵌套结构

我定义了一个Student类,创建了该类的实例列表并尝试将其转换为JSON格式,但当前代码输出的是JSON字符串数组,无法得到预期的嵌套结构JSON。

现有代码

import json
import uuid

class Student:
    def __init__(self, firstname : str, lastname : str, fathername : str):
        self.id = uuid.uuid4().hex
        self.firstname = firstname
        self.lastname = lastname
        self.fathername = fathername

    def __str__(self):
        return f'id:{self.id} ' \
               f'Firstname: {self.firstname}; ' \
               f'Lastname: {self.lastname}; ' \
               f'Fathername: {self.fathername}' \
               f'Group: {self.group}; '
    
    def toJSON(self):
        return json.dumps(self, default=lambda o: o.__dict__, indent=4)

list = []
student = Student("Vic", "Jeff", "Methon")
list.append(student.toJSON()) # Object of type Student is not JSON serializable
list.append(student.toJSON())
print(json.dumps(list))

当前输出结果

["{\n\"id\": \"f697b63d26264b02bc9c674c235c9e73\",\n\"firstname\": \"Vic\",\n\"lastname\": \"Jeff\",\n\"fathername\": \"Methon\"\n}", "{\n\"id\": \"f697b63d26264b02bc9c674c235c9e73\",\n\"firstname\": \"Vic\",\n\"lastname\": \"Jeff\",\n\"fathername\": \"Methon\"\n}"]

预期输出格式

{
    "Student": [
        {
            "id": "f697b63d26264b02bc9c674c235c9e73",
            "firstname": "Vic",
            "lastname": "Jeff",
            "fathername": "Methon"
        },
        {
            "id": "f697b63d26264b02bc9c674c235c9e73",
            "firstname": "Vic",
            "lastname": "Jeff",
            "fathername": "Methon"
        }
    ]
}

修改方案

问题核心是你提前把实例转换成了JSON字符串,再将这些字符串序列化就会得到字符串数组。正确做法是先把实例转成字典格式,再统一构建嵌套结构后序列化。

修改后的代码

import json
import uuid

class Student:
    def __init__(self, firstname : str, lastname : str, fathername : str):
        self.id = uuid.uuid4().hex
        self.firstname = firstname
        self.lastname = lastname
        self.fathername = fathername

    def __str__(self):
        return f'id:{self.id} ' \
               f'Firstname: {self.firstname}; ' \
               f'Lastname: {self.lastname}; ' \
               f'Fathername: {self.fathername}'
    
    # 改为返回字典,而非JSON字符串
    def to_dict(self):
        return self.__dict__

# 收集字典格式的实例数据
students = []
student1 = Student("Vic", "Jeff", "Methon")
students.append(student1.to_dict())
student2 = Student("Alice", "Smith", "John")
students.append(student2.to_dict())

# 构建嵌套结构并序列化
result = json.dumps({"Student": students}, indent=4)
print(result)

关键修改点

  • 将toJSON()方法改为to_dict(),直接返回实例的__dict__属性(字典形式的实例数据),避免提前序列化。
  • 列表中存储字典而非JSON字符串,确保后续统一序列化时能生成正确的嵌套结构。
  • 最后构建包含"Student"键的顶层字典,用json.dumps()统一序列化并指定indent=4实现格式化输出。

另外注意:原__str__方法中引用了未初始化的self.group属性,运行会报错,已在修改后的代码中移除该部分。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 20:45:09