Python嵌套对象JSON序列化问题:SalaryEmployeeList无法序列化
解决Python自定义对象JSON序列化问题(含salary/employee_list标签)
嗨,这个问题我之前也碰到过,Python的json模块默认只能序列化内置数据类型(比如字典、列表、字符串这些),自定义的Employee和SalaryEmployeeList对象它不认,所以才会报“不可JSON序列化”的错,而且如果不手动指定结构,自然也出不来你要的salary和employee_list标签。下面给你两种实用的解决方案:
方案一:自定义JSON编码器(适合复杂类结构)
我们可以继承json.JSONEncoder,重写default方法,告诉Python怎么把自定义对象转换成可序列化的字典结构:
import json # 你的Employee类(补全示例) class Employee: def __init__(self, id, name, salary): self.id = id self.name = name self.salary = salary # 补全SalaryEmployeeList类(根据你的需求推测) class SalaryEmployeeList: def __init__(self, salary, employee_list): self.salary = salary self.employee_list = employee_list # 自定义JSON编码器 class CustomJSONEncoder(json.JSONEncoder): def default(self, obj): # 处理Employee对象 if isinstance(obj, Employee): return { "id": obj.id, "name": obj.name, "salary": obj.salary } # 处理SalaryEmployeeList对象,自动带上你要的标签 elif isinstance(obj, SalaryEmployeeList): return { "salary": obj.salary, "employee_list": obj.employee_list } # 其他类型交给父类处理 return super().default(obj) # 测试用例 emp1 = Employee(1, "Alice", 5000) emp2 = Employee(2, "Bob", 5000) emp3 = Employee(3, "Charlie", 6000) salary_groups = [ SalaryEmployeeList(5000, [emp1, emp2]), SalaryEmployeeList(6000, [emp3]) ] # 生成符合要求的JSON json_result = json.dumps(salary_groups, cls=CustomJSONEncoder, indent=4) print(json_result)
运行后输出的JSON会自动包含salary和employee_list标签,而且所有Employee对象也会被正确序列化。
方案二:给类添加to_dict方法(简单直观)
如果你的类结构不复杂,直接在类里写一个to_dict方法,把对象转换成字典,再序列化会更直接:
import json class Employee: def __init__(self, id, name, salary): self.id = id self.name = name self.salary = salary # 把Employee转成字典 def to_dict(self): return { "id": self.id, "name": self.name, "salary": self.salary } class SalaryEmployeeList: def __init__(self, salary, employee_list): self.salary = salary self.employee_list = employee_list # 把SalaryEmployeeList转成带指定标签的字典 def to_dict(self): return { "salary": self.salary, "employee_list": [emp.to_dict() for emp in self.employee_list] } # 测试用例同上 salary_groups = [ SalaryEmployeeList(5000, [emp1, emp2]), SalaryEmployeeList(6000, [emp3]) ] # 先转成字典列表,再序列化 dict_groups = [group.to_dict() for group in salary_groups] json_result = json.dumps(dict_groups, indent=4) print(json_result)
这个方法的好处是逻辑清晰,你完全能控制每个字段的输出结构,避免踩编码器的坑。
为啥会出现这个问题?
简单说就是Python的json模块“认生”,只认识自带的数据类型。自定义类的对象在它眼里是个陌生玩意儿,不知道该怎么拆成JSON的键值对。而缺失标签的问题,是因为如果不手动指定结构,默认序列化对象时只会把对象的__dict__属性(也就是实例变量)直接转成JSON,但如果你的SalaryEmployeeList类没有正确定义salary和employee_list这两个属性,或者转换时没处理,自然就出不来这些标签。
内容的提问来源于stack exchange,提问作者JavaUser
相关产品推荐
相关产品推荐

