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

Flask框架下含转义字符的JSON请求体解析问题求助

解决Flask解析含转义字符JSON请求体的问题

首先得澄清一个误解:request.json完全可以解析包含合法转义字符的JSON,你遇到400错误的根本原因是你的curl命令发送的请求体本身就不是合法的JSON。

问题根源分析

当你在shell里执行这个curl命令时:

curl -k -X POST "http://127.0.0.1:8000/some" -H "Content-Type: application/json" -d "{\t\"name\": \"Alex\",\t\"age\": \"21\"}"

shell会先解析字符串里的转义字符:\t会被转换成实际的制表符(ASCII 0x09),而JSON规范明确禁止未转义的控制字符(包括制表符)。所以Flask接收到的请求体是包含未转义制表符的非法JSON,request.json解析时自然报错。

方案1:发送合法的JSON请求(推荐)

要让curl发送包含\t转义的合法JSON,你需要阻止shell解析字符串里的转义字符,有两种方式:

  • 用单引号包裹-d的内容(shell不会解析单引号内的转义):
curl -k -X POST "http://127.0.0.1:8000/some" -H "Content-Type: application/json" -d '{"name": "Alex\tDoe", "age": "21", "surname": "Doe"}'
  • 如果必须用双引号,需要把\t转义成\\t(让shell把\t原样传递给服务器):
curl -k -X POST "http://127.0.0.1:8000/some" -H "Content-Type: application/json" -d "{\\\"name\\\": \\\"Alex\\tDoe\\\", \\\"age\\\": \\\"21\\\", \\\"surname\\\": \\\"Doe\\\"}"

这样发送的请求体是合法的JSON,request.json就能正常解析了。另外注意你代码里的拼写错误:content["surneme"]应该是content["surname"],否则会触发KeyError。

方案2:手动处理非法JSON(仅当客户端无法修改时使用)

如果因为某些原因,客户端必须发送包含未转义制表符的请求体,你可以手动读取原始请求数据,清理后再解析:

from flask import Flask, request
import json

app = Flask(__name__)

@app.route('/some', methods=['POST'])
def raise_request():
    try:
        # 读取原始请求体并解码为字符串
        raw_body = request.get_data().decode('utf-8')
        # 将未转义的制表符替换为JSON允许的转义形式
        cleaned_body = raw_body.replace('\t', '\\t')
        # 手动解析JSON
        content = json.loads(cleaned_body)
    except json.JSONDecodeError as e:
        return f"Invalid JSON format: {str(e)}", 400
    
    # 使用get方法避免KeyError,同时处理拼写问题
    name = content.get("name", "Unknown")
    surname = content.get("surname", "Unknown")
    
    print(name)
    print(surname)
    return f"Hello {name} {surname}", 200

if __name__ == '__main__':
    app.run(port=8000)

这个方案先修正了非法的JSON内容,再进行解析,能绕过request.json的自动校验,但这只是权宜之计——优先保证客户端发送合法JSON才是规范的做法。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:39:36