Flask中get_json()返回None主因是Content-Type不匹配或请求体已被读取;需前端设application/json头,后端避免重复读取流,并用get_json(force/silent)控制解析行为。

Flask中调用get_json()前必须设置Content-Type: application/json
浏览器原生表单提交默认是application/x-www-form-urlencoded,直接用fetch或axios发JSON却不设头,request.get_json()会返回None——不是代码写错了,是请求根本没被识别为JSON。
实操建议:
- 前端发请求时显式设置
headers: {'Content-Type': 'application/json'} - 后端可加一层防御:如果
request.get_json() is None,尝试读request.get_data()再手动json.loads()(仅调试用,不推荐上线) - 用
curl测试时别漏掉-H "Content-Type: application/json",例如:curl -X POST http://127.0.0.1:5000/api -H "Content-Type: application/json" -d '{"name": "alice"}'
get_json()的force和silent参数怎么选
这两个参数控制异常行为,直接影响API健壮性。默认force=False,即只在Content-Type匹配时解析;silent=False,即解析失败抛BadRequest。
常见组合与场景:
- 生产API接口:保持默认,靠HTTP状态码暴露客户端错误(比如400 Bad Request),让调用方修正请求
- 兼容旧客户端(可能乱设
Content-Type):用request.get_json(force=True)跳过MIME检查,但注意这会掩盖真实问题 - 不想中断流程、自行处理解析失败:用
request.get_json(silent=True),失败时返回None而非异常 - 二者同时启用(
force=True, silent=True)风险高:连JSON格式错误都吞掉,调试困难
为什么get_json()有时返回None,但request.json又报错
request.json是属性访问,内部调用get_json()且默认silent=False,所以出错直接抛异常;而get_json()本身是方法,可控性更强。
典型错误现象:
-
request.json→BadRequest: Failed to decode JSON object:JSON字符串语法错误(如末尾多逗号、单引号代替双引号) -
request.get_json()→None:请求体为空、Content-Type不对、或已通过request.get_data()读取过一次(Flask的request流只能读一次) - 混合使用导致意外:先调
request.get_data()再调get_json(),后者必为None
接收嵌套JSON或数组时要注意编码和类型校验
get_json()只负责反序列化,不校验结构。前端传["a","b"]或{"items": ["a","b"]},后端拿到的就是对应Python对象,但字段缺失、类型错位得自己拦。
实操建议:
- 用
get_json()后立刻检查关键键是否存在:data = request.get_json(); if not data or 'user_id' not in data: - 数值字段容易被前端传成字符串(如
"123"),需手动int(data.get('id'))并捕获ValueError - 避免直接解包:
name, age = data['name'], data['age']—— 任一字段缺失就KeyError,改用.get()加默认值 - 复杂结构建议引入
pydantic或marshmallow做声明式校验,而不是堆if/else
实际项目里最容易被忽略的是请求体已被提前读取这个点——比如写了日志中间件调了request.get_data(),后面所有get_json()都失效。遇到None先查有没有其他地方碰过原始流。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











