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

Python请求获取JSON数据时JSONDecodeError问题排查

问题分析与解决方案

先帮你拆解下遇到的核心问题:浏览器能正常显示JSON内容,但requests返回的响应头标注为text/html,调用req_obj.json()还抛出JSONDecodeError,主要原因通常有这几个:

1. 响应内容夹杂非JSON冗余字符

服务器返回的内容虽然看起来是JSON,但实际可能隐藏了HTML注释、多余换行、空白前缀/后缀,甚至是不起眼的HTML标签。浏览器的JSON渲染器会自动过滤这些无效内容,只提取合法的JSON部分展示;但requests的json()方法严格遵循JSON规范解析,只要文本开头不是{或[这类合法JSON起始符,就会直接报错。

你可以先打印响应文本的前后片段验证这个猜测:

print("开头100字符:", req_obj.text[:100])
print("结尾100字符:", req_obj.text[-100:])

如果确实发现冗余内容,用正则提取完整的JSON块是个靠谱的办法:

import re
import json

# 匹配从{开始到}结束的所有内容(支持多行结构)
json_pattern = re.compile(r'\{.*\}', re.DOTALL)
match_result = json_pattern.search(req_obj.text)

if match_result:
    clean_json_str = match_result.group()
    try:
        data = json.loads(clean_json_str)
        print("解析成功:", data)
    except json.JSONDecodeError as e:
        print("清理后仍解析失败:", e)
else:
    print("未找到有效的JSON结构")

2. 服务器做了User-Agent校验

浏览器访问时会携带特定的User-Agent标识,而requests默认的UA是python-requests/x.x.x,有些服务器会根据UA返回不同格式的内容——给浏览器返回JSON(虽然标错了content-type),给爬虫类UA返回HTML或其他格式。

你可以模拟浏览器的UA重新请求试试:

headers = {
    'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
}
req_obj = requests.get(link, params=params, headers=headers)

# 再次尝试解析
try:
    data = req_obj.json()
    print("解析成功:", data)
except json.JSONDecodeError as e:
    print("仍解析失败:", e)

3. 额外排查:gzip解码异常?

虽然响应头有content-encoding: gzip,但requests默认会自动解码gzip内容,这个大概率不是问题。不过如果解码异常,也可以手动解码试试:

import gzip
from io import BytesIO

if req_obj.headers.get('content-encoding') == 'gzip':
    content = gzip.decompress(req_obj.content)
    json_str = content.decode('utf-8')
    data = json.loads(json_str)
else:
    data = req_obj.json()

总结下,优先检查UA是否被服务器限制,再看响应内容是否有冗余字符,这两个是最常见的触发原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:40:41