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

如何在Python中解析API响应中的JSON数据?,python,json,sql-server,api,parsing,Python,Json,Sql Server,Api,Parsing,我正在尝试编写一个脚本,从我们的监控工具中提取当前状态,并在MS SQL DB中更新它们。当我调用API时,会得到JSON格式的巨大响应: { "hoststatuslist": { "recordcount": "1084", "hoststatus": [ { "@attributes": { "id": "XXXX" }, "host_id": "XXX", "name":

我正在尝试编写一个脚本,从我们的监控工具中提取当前状态,并在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。我试图解析出每个主机的主机id、名称和状态文本

我试图做类似的事情,但我不断得到错误,响应对象没有读取或解码属性

这是我目前的代码:

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')

如果响应来自Flask应用程序,则需要使用
response.get_json()


另外,请确保您拥有烧瓶的更新版本。

在我看来,您不一定需要调用
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
这可以更快地完成(生成器)/以更紧凑的格式完成(列表理解),但我试着写一些容易理解的东西


Python对于这样的工作来说是一种非常好的语言。

我不确定我是否没有正确解释自己,或者我是否误解了你的帖子,但这篇帖子很简单,给了我json数据。我已经有了从json数据中提取主机名/状态所需的数据。作为一个旁注,当我尝试r.encoding时,我没有收到任何响应,即使状态代码是200
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