如何从 Python 中的 API 响应解析 JSON 数据?

新手上路,请多包涵

我正在尝试编写一个脚本,该脚本将从我们的监控工具中提取当前状态并在 MS SQL DB 中更新它们。当我调用 API 时,我收到了 JSON 格式的巨大响应:

 {
  "hoststatuslist": {
    "recordcount": "1084",
    "hoststatus": [
      {
        "@attributes": {
          "id": "XXXX"
        },
        "host_id": "XXX",
        "name": "XXXXX",
        "display_name": "XXXXXXX",
        "address": "XXXXXX",
        "alias": "XXXXXX",
        "status_text": "XXXXXXXXXXXXXXXXXXXXXXX",
        etc.
      },
      {
        "@attributes": {
          "id": "XXXX"
        },
        "host_id": "XXX",
        "name": "XXXXX",
        "display_name": "XXXXXXX",
        "address": "XXXXXX",
        "alias": "XXXXXX",
        "status_text": "XXXXXXXXXXXXXXXXXXXXXXX",
        etc.
      },
      etc.
    ]
  }
}

如您所见,我获得了 1000 多个具有属性的主机对象。我想解析响应,以便我可以添加/更新 MS SQL 数据库。我正在尝试解析每个主机的 _hostidname 和 _statustext

我尝试做类似 Python - 解析 JSON 数据集 的事情,但我不断收到响应对象没有属性读取或解码的错误。

这是我当前的代码:

 import requests
import json

response = requests.get('url with API Key')
decoded_response = response.read().decode("UTF-8")
data = json.loads(decoded_response)
jsonData = data["hoststatus"]

for host in jsonData:
    Name = host.get("name")
    StatusText = host.get("status_text")

如果有人建议用另一种语言或工具来做到这一点,我很乐意接受。我需要调用大约 20 个 API,并将所有状态/其他信息放入数据库中,以便它们都在一个位置。

任何帮助表示赞赏。

原文由 Wish I Knew this stuff 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 607
2 个回答

正如@danil-kondratiev 所说,您可以使用 response.json() 并且不需要编码/解码。这对你有用吗?

 import requests

response = requests.get('url with keys')

json_data = response.json() if response and response.status_code == 200 else None

if json_data and 'hoststatuslist' in json_data:
    if 'hoststatus' in json_data['hoststatuslist']:
        for hoststatus in json_data['hoststatuslist']['hoststatus']:
            host_name = hoststatus.get('name')
            status_text = hoststatus.get('status_text')

原文由 j-bin 发布,翻译遵循 CC BY-SA 3.0 许可协议

在我看来,您不一定需要致电 response.decode(...) 。这应该足够了:

 import requests

response = requests.get('url with API Key') # Note: the timeout parameter is very useful for requests!
data = response.json()

if 'hoststatus' in data and isinstance(data['hoststatus'], list):
    list_to_return = list()  # we'll put the filtered results in this
    for element in data['hoststatus']
        current_item = {  # create a dict of the 3 required values
            host_id = element['host_id'],
            name = element['name'],
            status_text = element['status_text']
        }
        list_to_return.append(current_item)  # add it to the return list

# list_to_return now has all of the required 3 properties stored for all items in an easily-accessible format

这可以更快地完成(生成器)/以更紧凑的格式(列表理解),但我试图写一些容易理解的东西。

原文由 Dávid Kiss 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题