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

Python使用Requests调用接口报json.decoder.JSONDecodeError错误如何解决

错误触发原因

这个JSONDecodeError的直接原因是请求OpenCitations接口后返回的响应内容不是合法JSON格式,根本问题出在seed_dois的构造和后续遍历逻辑上:

  1. 你向seed_dois中追加的是Crossref接口返回的response_data['message']['items'],哪怕你设置了sample=1,这个items始终是列表类型,不是单独的DOI字符串。
  2. 后续遍历seed_dois拼接URL时,传入的是列表而非字符串,最终请求的URL格式非法,OpenCitations接口返回错误响应(如400错误页、纯文本报错),这类内容无法被解析为JSON,就触发了报错。
  3. 额外逻辑问题:你当前的代码缩进有误,处理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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 04:09:02