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

