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

Flask项目返回JSON时无法序列化Enum值的问题咨询

Flask枚举序列化错误问题分析与解决

场景复现

搭建Flask项目时定义了员工模型,使用枚举类GenderChoices处理性别字段,数据可正常存入数据库,但返回响应时触发JSON序列化错误:

TypeError: Object of type GenderChoices is not JSON serializable

相关代码如下:

枚举与模型定义

class GenderChoices(enum.Enum):
    M = 'M'
    F = 'F'

    def __str__(self):
        return self.name

    @staticmethod
    def from_string(s):
        try:
            return GenderChoices[s]
        except KeyError:
            raise ValueError()


class Employees(db.Model):
    __tablename__ = "employees"

    emp_no = db.Column(db.Integer, primary_key=True)
    gender = db.Column(db.Enum(GenderChoices, values_callable=lambda x: [str(member.value)
                                                                         for member in GenderChoices]))

请求参数解析

parser.add_argument('gender',
                    type=GenderChoices.from_string,
                    help='This field cannot be blank',
                    required=True,
                    choices=list(GenderChoices))

响应返回代码

return {
            'message': 'New Employee Has been created',
            'Employee_Details': {
                'employee_id': new_id,
                'gender': data['gender']
            }
        }, 201

问题原因

data['gender']是GenderChoices的枚举实例,Python标准JSON序列化器无法识别枚举类型对象,因此返回响应时直接返回枚举实例会触发序列化错误。

而数据库能正常存储是因为SQLAlchemy已经实现了枚举与数据库字段的映射逻辑,自动完成了枚举到数据库值的转换,但Flask返回JSON响应时不会自动处理枚举的序列化。

解决方案

方法1:手动转换为字符串(利用已定义的__str__方法)

修改响应中的gender字段,将枚举实例转为字符串:

return {
            'message': 'New Employee Has been created',
            'Employee_Details': {
                'employee_id': new_id,
                'gender': str(data['gender'])
            }
        }, 201

此方法会返回枚举的name值(即M或F),与你定义的__str__方法逻辑一致。

方法2:直接返回枚举的value值

如果需要返回枚举对应的实际值(同样是'M'或'F'),可以直接访问枚举的value属性:

return {
            'message': 'New Employee Has been created',
            'Employee_Details': {
                'employee_id': new_id,
                'gender': data['gender'].value
            }
        }, 201

方法3:全局自定义JSON编码器(适合多场景使用枚举)

在Flask应用中注册自定义JSON编码器,自动处理所有枚举类型的序列化:

from flask import Flask
from flask.json import JSONEncoder
from enum import Enum

app = Flask(__name__)

class CustomJSONEncoder(JSONEncoder):
    def default(self, obj):
        if isinstance(obj, Enum):
            return obj.value  # 若需要返回name则改为obj.name
        return super().default(obj)

app.json_encoder = CustomJSONEncoder

配置后,所有返回响应中的枚举对象都会被自动序列化为指定的格式,无需每次手动转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:32:45