从zabbix API响应列表Python3获取键和值

时间:2019-04-26 07:57:08

标签: python json api python-requests zabbix

我在处理来自zabbix的数据时遇到问题。我创建如下请求:

requests = zapi.host.get({"output": ZabbixApiValues,"selectInventory":ZabbixApiValues, "filter": {"host": ["Cisco"]}}) 

ZabbixApiValues是我需要从zabbix获取的字段列表:(列表是否在其他函数中生成,现在都无所谓)

['oob_ip', 'location', 'description', 'host', 'os']
<class 'list'>

然后从Zabbix API获得响应:

[{'hostid': '10460', 'description': 'This is testing host', 'host': 'Cisco', 'inventory': {'hostid': '10460', 'oob_ip': '', 'location': 'Tokyo', 'os': 'Linux Mint'}}]
<class 'list'>

现在我必须获取所有这些字段

('host': 'Cisco', 'location': 'Tokyo' etc. etc.) 
从zabbix响应并以XML格式创建对另一个系统的API请求。 我知道该怎么做,但我无法从此响应中获取必要的字段。我希望我只得到[json]:[value]而没有jsons childm:  'hostid': '10460', 'description': 'This is testing host', 'host': 'Cisco','hostid': '10460', 'oob_ip': '', 'location': 'Tokyo', 'os': 'Linux Mint' 也许作为字典。没有“库存”。然后我可以获取键和值并创建xml。

现在我可以获取包含所有数据的字符串或仅包含库存数据而不是所有字段的x ['inventory']。

请帮助

3 个答案:

答案 0 :(得分:0)

打印(请求[0])

{'hostid': '10460', 'description': 'This is testing host names Fortigate 100D.', 'host': 'Fortinet-Fortigate 100D', 'inventory': {'hostid': '10460', 'oob_ip': '', 'location': 'Warsaw', 'os': ''}}

打印(请求)

[{'hostid': '10460', 'description': 'This is testing host names Fortigate 100D.', 'host': 'Fortinet-Fortigate 100D', 'inventory': {'hostid': '10460', 'oob_ip': '', 'location': 'Warsaw', 'os': ''}}]

答案 1 :(得分:0)

Zabbix响应的类型为list,然后您将其转换为json数据,所以现在它是json字符串,您无法访问此类元素,您需要加载

这样的json数据
JSrequests = json.dumps(requests)
x = json.loads(JSrequests)
resp_dict = x[0]

现在这是字典,您可以访问类似

的元素
x[0]['description']

不确定为什么要这样做,请求的类型为列表,无需转换为json,将字典移出列表并访问元素,即

x = requests[0] # dict

答案 2 :(得分:0)

简单...我是Python新手,...呃 谢谢。所以我有:

print('requests',requests)
print ('ZabbixApiValues',ZabbixApiValues)
for x in ZabbixApiValues:
    if (x in requests[0]):
        print(x,":",requests[0][x])
    elif (x in requests[0]['inventory']):
        print(x,":",requests[0]['inventory'][x])

我得到:

requests [{'hostid': '10460', 'description': 'This is testing host names Fortigate 100D.', 'host': 'Fortinet-Fortigate 100D', 'inventory': {'hostid': '10460', 'oob_ip': '', 'location': 'Warsaw', 'os': ''}}]
ZabbixApiValues ['oob_ip', 'location', 'description', 'host', 'os']
oob_ip : 
location : Warsaw
description : This is testing host names Fortigate 100D.
host : Fortinet-Fortigate 100D
os :