当前位置: 首页 > article >正文

如何正确处理和解析 GitHub API 返回的 JSON 数据:详细指南与示例

如何正确处理和解析 GitHub API 返回的 JSON 数据:详细指南与示例

问题产生的原因

在使用 Python 的 requests 库处理从 GitHub API 返回的 JSON 数据时,如果不调用 .json() 方法,将会导致无法正确访问和操作返回的数据。主要原因有两个:

  1. 数据格式理解错误

    • requests.get() 方法返回的是一个 Response 对象,它包含了完整的 HTTP 响应信息,如状态码、响应头、以及响应体(通常是字符串格式)。
    • 如果不调用 .json() 方法,响应体中的字符串格式的 JSON 数据不会被自动转换成 Python 的字典或列表。因此,直接尝试从 Response 对象访问 JSON 的键(如 response['assets'])会导致错误。
  2. 属性访问错误

    • Response 对象本身并不支持直接字典式的键访问(如 response['assets'])。这种访问方式是字典的特性,而非 Response 对象的方法或属性。

具体解决方案

要正确处理从 GitHub API 返回的 JSON 数据,应遵循以下步骤:

1. 正确调用 .json() 方法

在请求结束后,立即使用 .json() 方法将 JSON 格式的字符串响应转换为 Python 可操作的字典或列表。

示例代码

import requests

# 配置请求头部,包含认证信息
headers = {
    'Authorization': 'token YOUR_PERSONAL_ACCESS_TOKEN'
}

# 发送请求,并立即转换响应为 JSON
url = 'https://api.github.com/repos/ultralytics/yolov5/releases/tags/v5.0'
response = requests.get(url, headers=headers).json()

# 正确访问 JSON 数据
assets = [x['name'] for x in response['assets']]
tag = response['tag_name']

# 打印结果
print(f"Tag: {tag}")
for asset in assets:
    print(f"Asset Name: {asset}")
2. 错误处理

在处理网络请求和数据转换时,应添加错误处理逻辑,以防响应不是有效的 JSON 或请求失败。

增强的示例代码

import requests

headers = {
    'Authorization': 'token YOUR_PERSONAL_ACCESS_TOKEN'
}
url = 'https://api.github.com/repos/ultralytics/yolov5/releases/tags/v5.0'

try:
    response = requests.get(url, headers=headers)
    response.raise_for_status()  # 检查响应状态,如果是4XX或5XX则抛出异常
    data = response.json()  # 尝试解析 JSON
except requests.exceptions.HTTPError as err:
    print(f"HTTP error occurred: {err}")  # 打印 HTTP 错误信息
except ValueError:
    print("Invalid JSON")  # 捕获 JSON 解析错误
except Exception as err:
    print(f"Other error occurred: {err}")  # 捕获其他可能的错误
else:
    assets = [x['name'] for x in data['assets']]
    tag = data['tag_name']
    print(f"Tag: {tag}")
    for asset in assets:
        print(f"Asset Name: {asset}")

总结

通过正确使用 .json() 方法处理 API 响应,并结合适当的错误处理机制,您可以有效、安全地从 GitHub API 获取和操作数据。这不仅提高了代码的健壮性,也确保了在面对网络或数据格式问题时能够优雅地处理错误。


http://www.kler.cn/a/418693.html

相关文章:

  • 基于yolov8、yolov5的铝材缺陷检测识别系统(含UI界面、训练好的模型、Python代码、数据集)
  • HTTPS 加密
  • 第三方Express 路由和路由中间件
  • HTML5系列(2)--表单增强与验证
  • 半桥LLC谐振变换器及同步整流MATLAB仿真(二)
  • Winform和WPF的区别
  • 多线程相关案例
  • 文本内容处理命令和正则表达式
  • 使用springBoot的freemarker生成按模板生成word
  • pycharm(一)安装
  • electron学习 渲染进程与主进程通信
  • ArrayList和LinkedList的区别(详解)
  • Mybatis:CRUD数据操作之多条件查询及动态SQL
  • 基于RISC-V 的代理内核实验(使用ub虚拟机安装基本环境)
  • Vivado程序固化到Flash
  • 「Mac畅玩鸿蒙与硬件34」UI互动应用篇11 - 颜色选择器
  • 【VUE3】【Naive UI】<NCard> 标签
  • Redis 3 种特殊数据类型详解
  • 详解Qt 之QSwipeGesture手势滑动
  • unity中:Unity 中异步与协程结合实现线程阻塞的http数据请求
  • OGRE 3D----2. QGRE + QQuickView
  • 【博主推荐】C#中winfrom开发常用技术点收集
  • 如何在 Ubuntu 16.04 上使用 GitLab CI 设置持续集成流水线
  • 基于ZYNQ-7000系列的FPGA学习笔记3——开发环境搭建点亮一个LED
  • 1.2 算法和算法评价
  • 计算机网络之传输层协议UDP