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

Python requests请求返回200偶发JSONDecodeError报错根因咨询

报错根因与解决方案

json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 错误的核心是requests拿到的响应正文不符合JSON格式要求,且正文首字符就不满足JSON语法规范,HTTP状态码为200仅代表请求链路连通,和返回内容是否合法无关。

常见偶发报错根因

  • 请求头未正确设置Content-Type: application/json,服务端无法正确解析POST请求的JSON格式参数,偶发返回非JSON格式的错误提示,即使状态码为200
  • 接口偶发返回空响应体:服务端逻辑异常、瞬时过载时,可能返回状态码200但响应正文为空,没有任何可解析的JSON内容
  • 接口返回非JSON格式内容:偶发场景下服务端/中间代理/网关可能返回纯文本错误提示、HTML错误页等非JSON内容,比如瞬时限流提示、服务降级提示,这类内容首字符不是JSON要求的{或[,直接触发解析错误
  • 响应编码不匹配:接口返回的JSON使用了非UTF-8编码(比如GBK、GB2312),且未在响应头中声明正确编码,requests默认用UTF-8解码后产生乱码,导致首字符不符合JSON语法
  • 网络传输异常:中间代理、网络波动导致响应体被截断,拿到的内容不完整,首段内容丢失无法解析

排查方法

在异常捕获块中打印完整的响应信息即可定位具体原因,代码示例:

import sys
import requests
import json

response = requests.post(url=url, data=json.dumps(data), headers=headers)
try:
    data_dict = response.json()
except:
    # 打印关键信息定位问题
    print(f"响应状态码:{response.status_code}")
    print(f"响应头Content-Type:{response.headers.get('Content-Type')}")
    print(f"响应正文前100字符:{response.text[:100]}")
    print(sys.exc_info())

优化方案

  • 请求头补充Content-Type: application/json配置,保证服务端能正确识别请求体格式
  • 解析前增加前置校验,优先判断Content-Type是否为JSON类型、响应正文是否为空
  • 手动指定响应编码匹配服务端实际编码,比如response.encoding = 'utf-8'
  • 针对偶发异常增加重试机制,对JSON解析错误的场景设置最多3次重试,覆盖瞬时网络、服务端波动问题
  • 针对非预期返回的场景增加兜底逻辑,避免程序直接崩溃

内容的提问来源于stack exchange,提问作者Sarvendra Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 14:42:02