症状
调用 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 误判为服务异常;应在解析前先判断内容是否存在。