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

