← 中文资源

简体中文版本

Python 解析响应时报 json.decoder.JSONDecodeError

通过检查实际收到的原始字节,诊断 JSONDecodeError,因为空响应或 HTML 响应体并非合法 JSON。

阅读英文原文

症状

调用 response.json() 抛出 JSONDecodeError,通常是 Expecting value: line 1 column 1,说明解析器根本没看到 JSON。这常见于 204 响应体为空,或错误页与认证重定向返回了 HTML。因为异常由 JSON 解析器抛出,它错误地看起来像序列化问题,而非响应内容问题。

诊断

解析前打印状态码、content-type 与前若干字节;用 curl -i 查看响应头;对抓到的字节直接 json.loads 复现,确认是哪段输入触发。

python -c "import requests; r=requests.get(url); print(r.status_code, r.headers.get('content-type'), repr(r.text[:200]))"

根因

解析器收到了并非合法 JSON 的字节,因为响应体为空、是错误页或其它非 JSON 内容,而不是 JSON 库本身有缺陷。

修复

解析前校验状态与内容类型,显式处理空响应体,并在错误信息中带上原始片段,使后续失败可诊断。

验证

重发请求确认解析成功;或确认新的守卫对非 JSON 情况抛出带状态与内容类型的明确错误,而非裸的 JSONDecodeError。两种结果都能证明诊断成立。

常见陷阱

对空响应体不区分处理,会把正常的 204 误判为服务异常;应在解析前先判断内容是否存在。