Flask报错:Object of type TypeError is not JSON serializable修复
问题根因
报错触发逻辑非常明确:你贴的Postman请求配置、请求体格式都是合法的,报错和请求端无关,问题出在服务端响应逻辑:except代码块中直接将Python原生异常对象e放入响应字典,Flask-RESTful内置的JSON序列化器仅支持字符串、数值、字典、列表等标准JSON兼容类型,无法直接序列化异常类实例,最终抛出TypeError: Object of type TypeError is not JSON serializable错误。你查到的自定义flask.json.JSONEncoder方案属于全局扩展方案,用来解决当前问题属于过度设计,不需要修改全局编码器就能修复。
修复步骤
- 即时修复:将异常对象转为字符串类型后再放入响应,同时建议错误响应携带对应500状态码,避免接口误返回200成功状态。
修正后的异常捕获代码如下:
except Exception as e: # 异常对象转字符串后即可被JSON正常序列化 return {'Answer': str(e)}, 500
改完之后再触发异常时,接口会正常返回异常的文本信息,不会再报序列化错误。
- 可选扩展(适配你引入的pandas/numpy/datetime依赖):如果后续计算逻辑需要返回numpy数值、pandas结构、日期类型的结果,再考虑配置自定义JSON编码器统一处理这些非标准JSON类型,不需要为了返回异常单独加这个配置。参考配置如下:
from flask.json import JSONEncoder import numpy as np import pandas as pd from datetime import date, datetime class CustomJSONEncoder(JSONEncoder): def default(self, obj): # 适配numpy整数/浮点数类型 if isinstance(obj, (np.integer, np.int64)): return int(obj) if isinstance(obj, (np.floating, np.float64)): return float(obj) # 适配numpy数组 if isinstance(obj, np.ndarray): return obj.tolist() # 适配pandas结构 if isinstance(obj, (pd.DataFrame, pd.Series)): return obj.to_dict() # 适配日期时间类型 if isinstance(obj, (date, datetime)): return obj.isoformat() # 适配异常类型 if isinstance(obj, Exception): return str(obj) return super().default(obj) # 将自定义编码器注册到Flask应用 app.json_encoder = CustomJSONEncoder
提示:你当前代码取请求参数直接用
parametros['字段名']的方式,如果请求体缺失对应字段会直接抛KeyError,建议改用parametros.get('字段名')的方式取值,方便做前置参数校验,返回更明确的参数错误提示。
内容的提问来源于stack exchange,提问作者Racchel
相关产品推荐
相关产品推荐

