如何将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
相关产品推荐
相关产品推荐

