解析application/json类型API响应时遇JSONDecodeError,需获取各分类id
解决JSONDecodeError: 额外数据:第1行第2列(字符1)问题
问题本质
这个错误说明你请求的API返回的内容不是合法的单个JSON结构,常见原因包括:
- 响应开头有多余字符(如UTF-8 BOM头、空格、注释)
- 返回了多个独立的JSON对象(比如
{...}{...}这种拼接格式) - 实际是JSONP格式(带回调函数包裹)而非纯JSON
排查与修复步骤
1. 先确认原始响应内容
在调用.json()前,先打印原始响应文本,明确问题所在:
import requests responseObj = requests.get(myAPIurl) # 打印原始响应内容 print("原始响应文本:", responseObj.text) # 确认响应头的Content-Type print("响应类型:", responseObj.headers.get('Content-Type'))
2. 针对不同场景的修复方案
场景1:响应带BOM头或多余前缀
如果响应开头有\ufeff这类BOM字符,手动清理后再解析:
import json import requests responseObj = requests.get(myAPIurl) # 去除UTF-8 BOM头 cleaned_text = responseObj.text.encode('utf-8').decode('utf-8-sig') data = json.loads(cleaned_text)
场景2:返回多个JSON对象(JSON流)
如果API返回的是多行JSON(NDJSON)或拼接的多个对象,拆分后逐个解析:
import json import requests responseObj = requests.get(myAPIurl) # 按换行拆分处理NDJSON格式 decoder = json.JSONDecoder() pos = 0 all_data = [] while pos < len(responseObj.text): obj, pos = decoder.raw_decode(responseObj.text, pos) all_data.append(obj) # 若返回的是单个预期结构,取第一个即可 data = all_data[0]
场景3:实际是JSONP格式
如果响应是callback({...})这类JSONP,提取中间的JSON部分:
import json import requests responseObj = requests.get(myAPIurl) # 提取括号内的JSON内容 json_str = responseObj.text.split('(')[1].split(')')[0] data = json.loads(json_str)
提取各分类下的ID
成功解析数据后,遍历指定分类提取ID:
# 假设data是解析后的字典 target_categories = ['articles', 'news', 'blogs', 'books', 'events'] all_ids = [] for category in target_categories: items = data.get(category, []) for item in items: item_id = item.get('id') if item_id: all_ids.append(item_id) print("所有分类的ID列表:", all_ids)
内容的提问来源于stack exchange,提问作者maverick-murthy
相关产品推荐
相关产品推荐

