Python使用Requests调用接口报json.decoder.JSONDecodeError错误如何解决
错误触发原因
这个JSONDecodeError的直接原因是请求OpenCitations接口后返回的响应内容不是合法JSON格式,根本问题出在seed_dois的构造和后续遍历逻辑上:
- 你向
seed_dois中追加的是Crossref接口返回的response_data['message']['items'],哪怕你设置了sample=1,这个items始终是列表类型,不是单独的DOI字符串。 - 后续遍历
seed_dois拼接URL时,传入的是列表而非字符串,最终请求的URL格式非法,OpenCitations接口返回错误响应(如400错误页、纯文本报错),这类内容无法被解析为JSON,就触发了报错。 - 额外逻辑问题:你当前的代码缩进有误,处理
response_data提取citing_dois的逻辑在请求循环之外,只会处理最后一次请求的结果,前面所有请求的结果都会被覆盖丢失。
解决方法
修改两处代码逻辑即可:
1. 修正seed_dois的构造逻辑,提取纯DOI字符串
把原来构造seed_dois的循环改成如下形式,判断返回结果不为空后提取DOI字符串存入列表:
seed_dois=[] for variation in name_variations: response = requests.get(url=f"https://api.crossref.org/works?filter=from-pub-date:{search_year_start},until-pub-date:{search_end_start},has-affiliation:true&query.affiliation={variation}&sample=1&select=DOI") # 先校验接口返回状态正常再解析 if response.status_code == 200: response_data = response.json() items = response_data['message']['items'] if items: # 避免返回空结果报错 seed_dois.append(items[0]['DOI'])
2. 修正后续请求和数据处理的缩进,完善校验
把请求OpenCitations和提取引用DOI的逻辑合并到同一个循环内,同时添加响应校验:
citing_dois=[] for doi in seed_dois: response=requests.get(url=f"https://opencitations.net/index/coci/api/v1/citations/{doi}") if response.status_code == 200: # 校验返回正常再解析JSON response_data = response.json() for item in response_data: citing_dois.append(item['citing'])
额外优化建议
- 可以给requests请求添加超时参数,避免接口无响应导致程序卡住,比如
requests.get(url, timeout=10) - 机构名称如果包含特殊字符,直接拼接URL会导致格式错误,可以把query参数交给requests的params参数自动编码,避免非法URL问题。
内容的提问来源于stack exchange,提问作者user1222447
相关产品推荐
相关产品推荐

