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

Flask应用如何捕获JSON解析错误并返回自定义响应?

如何在Flask中捕获JSON解码错误并返回自定义响应

你的问题核心是Flask默认在JSON解析失败时返回通用的400页面,而你想要更友好的自定义响应。其实只需要在尝试解析JSON的代码块外层添加try-except捕获即可,具体看下面的修改示例:

修改后的完整代码

from flask import Flask, request, jsonify
import json

@app.route("/endpoint/", methods=['POST'])
def mypostmethod():
    # 先检查Content-Type(简化写法,用get避免KeyError)
    if request.headers.get('Content-Type') == 'application/json':
        try:
            # 解析JSON的步骤放在try块内,这一步会触发解码错误
            req_data = request.get_json()
            # 同时处理缺少必填字段的情况
            content = req_data['content']
            return content
        except json.JSONDecodeError as e:
            # 自定义JSON解码失败的响应
            return jsonify({
                "code": 400,
                "message": "请求体不是有效的JSON格式",
                "detail": str(e)
            }), 400
        except KeyError:
            # 处理缺少content字段的情况
            return jsonify({
                "code": 400,
                "message": "请求缺少必填字段'content'"
            }), 400
    else:
        # 处理Content-Type不符合要求的情况
        return jsonify({
            "code": 415,
            "message": "仅支持application/json格式的请求体"
        }), 415

关键说明:

  • try块的位置:必须包裹request.get_json()(或request.json,两者等价)的调用,因为这一步是Flask尝试解析请求体JSON的核心环节,格式错误时会直接抛出json.JSONDecodeError异常。
  • 异常分层处理:
    • json.JSONDecodeError:专门捕获JSON格式错误的场景(比如你遇到的单引号代替双引号的问题),返回的错误详情能帮助调用方快速定位问题。
    • KeyError:额外捕获缺少content字段的情况,让接口的错误处理更全面,避免因为字段缺失返回通用500错误。
  • 响应规范:
    • 用jsonify返回JSON格式的错误响应,比纯文本或HTML更适合API场景。
    • 状态码严格遵循HTTP规范:400表示请求格式错误,415表示不支持的媒体类型(Content-Type不符合要求)。

补充:关于你的curl命令

你原来的curl命令出错是因为shell解析规则:单引号包裹的字符串里不能直接嵌套单引号(会被shell提前截断)。正确的写法有两种:

# 写法1:用双引号包裹JSON,内部双引号转义
curl -X POST "localhost:8080/endpoint/" -H "Content-Type: application/json" -d "{\"content\": \"Blah\"}"

# 写法2:用单引号包裹JSON,内部用双引号(更简洁推荐)
curl -X POST "localhost:8080/endpoint/" -H "Content-Type: application/json" -d '{"content": "Blah"}'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 21:34:07