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

Python json.loads解析GitHub接口JSON返回列表而非字典报错

问题根因

触发报错的核心原因有两个:

  1. 接口请求环节没有按GitHub API要求传标准请求头,或者实际请求URL和你预期的单条评论接口不一致,导致接口返回了评论列表/错误信息列表,而非单条评论的字典对象。json.loads本身不会固定返回字典类型:JSON顶层是数组就解析成列表,顶层是对象就解析成字典,不存在强制转字典的逻辑。
  2. 业务逻辑本身存在代码错误:遍历礼貌词元组时,对每个字符串类型的词取word[0]/word[1]/word[2]拿到的是单词的单个字符,完全不符合关键词匹配的预期;且循环内部直接写return,第一个词判断完就会终止函数,根本不会遍历完所有关键词。
修复方案

按以下步骤调整即可:

  • 请求GitHub接口时必须带上标准API请求头,避免返回非预期格式的内容,访问私有仓库还需要补充鉴权token
  • 不要手动用json.loads()解析响应文本,直接调用requests自带的json()方法,自动处理编码和解析兼容问题
  • 拿到解析结果后先做类型校验:如果返回列表,优先判断是否为URL写错拿到了评论列表,取对应元素即可得到字典结构的评论数据;如果返回字典直接使用
  • 修正关键词匹配逻辑,去掉错误的字符串索引写法,补全全量遍历逻辑,不要在循环内提前返回导致匹配不全
修正后的可运行代码
import requests

comment_url = "https://api.github.com/repos/octocat/Hello-World/pulls/comments/1"
#  GitHub API强制要求的请求头,缺失会返回异常格式
headers = {
    "Accept": "application/vnd.github+json",
    "X-GitHub-Api-Version": "2022-11-28"
}

resp = requests.get(comment_url, headers=headers)
# 先抛HTTP请求错误,比如404、401、403这类异常
resp.raise_for_status()
comment_data = resp.json()

# 兼容返回列表的场景
if isinstance(comment_data, list):
    if len(comment_data) == 0:
        return 'skipped'
    # 如果是评论列表,取第一条即可得到字典结构的单条评论
    pull_request_comment = comment_data[0]
elif isinstance(comment_data, dict):
    pull_request_comment = comment_data
else:
    return 'skipped'

polite_words = ("please", "appreciate", "would be great")
comment_body = pull_request_comment.get("body", "").lower()

is_polite = False
for word in polite_words:
    if word.lower() in comment_body:
        is_polite = True
        break

if is_polite:
    print("You are polite!!!")
    return 'ok'
else:
    print("You are impolite!!")
    return 'skipped'

如果调整后还是拿到列表,先打印响应状态码和原始响应文本,大概率是鉴权失败、资源不存在等异常场景返回的错误列表,根据返回的错误提示调整请求参数即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:09:21