簡體   English   中英

如何在 Python 中解析來自 API 響應的 JSON 數據?

[英]How to parse JSON data from API response in Python?

我正在嘗試編寫一個腳本,該腳本將從我們的監控工具中提取當前狀態並在 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 DB。 我正在嘗試解析每個主機的host_idnamestatus_text

我試圖做類似Python - Parsing JSON Data Set但我不斷收到響應對象沒有屬性讀取或解碼的錯誤。

這是我當前的代碼:

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 並將所有狀態/其他信息放入數據庫中,以便它們都在一個位置。

任何幫助表示贊賞。

就像@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')

在我看來,您不一定需要調用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

這可以更快(生成器)/以更緊湊的格式(列表理解)完成,但我試圖寫一些易於理解的東西。

嘗試。 請求文檔

requests.get('https://api.github.com/user', auth=('user', 'pass'))
>>>r.status_code
200
>>> r.encoding
'utf-8'
>>> r.json()
{json}

如果響應來自 Flask 應用程序,則需要使用response.get_json()

此外,請確保您擁有 Flask 的更新版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM