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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:12:01