Flask REST API JSON解码失败求助:Expecting value错误
解决Flask-RESTful POST请求JSON解码失败的问题
嘿,我刚看完你的问题,这个JSON解码错误其实很常见,核心问题出在curl命令的引号使用和JSON格式规范上,我帮你一步步搞定:
问题到底出在哪?
你写的curl命令里,JSON数据的引号冲突了:
curl -H "Content-Type: application/json" -X POST -d '{'username':"abc",'password':"abc"}' http://localhost:5000
首先,shell会把外层的单引号当成内容的起始和结束标记,你内部的单引号会提前闭合这个标记,导致实际发送给服务器的内容完全不是有效的JSON——甚至可能是空的,这就是Flask提示"Failed to decode JSON object"的原因。
另外还有个容易忽略的点:标准JSON要求所有键和字符串值必须用双引号,单引号是不被JSON解析器认可的,哪怕你加了force=True也没用哦。
具体解决方案
1. 修正你的curl命令
有两种正确的写法,选一种就行:
- 方法一:用双引号包裹整个JSON,内部的双引号用反斜杠转义(避免shell解析)
curl -H "Content-Type: application/json" -X POST -d "{\"username\":\"abc\",\"password\":\"abc\"}" http://localhost:5000
- 方法二:用单引号包裹整个JSON,内部的键和值统一用双引号(shell不会解析单引号内部的双引号)
curl -H "Content-Type: application/json" -X POST -d '{"username":"abc","password":"abc"}' http://localhost:5000
2. Postman测试的正确姿势
如果你用Postman,记得这几点:
- 请求方法选POST
- 切换到Body标签,选择
raw格式,然后在右侧下拉框选JSON - 输入标准的JSON内容:
{"username":"abc","password":"abc"}
Postman会自动帮你加上Content-Type: application/json请求头,不用手动添加。
3. 代码可以更规范一点
你代码里的request.get_json(force=True)虽然能强制解析,但其实不太符合REST规范——最好让Flask只在客户端正确设置Content-Type时才解析JSON,同时可以加上无效JSON的判断:
def post(self): data_json = request.get_json() # 去掉force=True if not data_json: return {"error": "请发送有效的JSON数据,并设置Content-Type: application/json"}, 400 return {'you sent': data_json}
这样客户端如果请求格式不对,能得到更明确的错误提示。
验证一下
修改完curl命令后执行,你应该会收到这样的响应:
{"you sent": {"username": "abc", "password": "abc"}}
内容的提问来源于stack exchange,提问作者FProlog
相关产品推荐
相关产品推荐

