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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 11:30:55