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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 03:54:45