Python JSON密钥错误,但密钥匹配

Python JSON密钥错误,但密钥匹配,python,ansible,Python,Ansible,新手程序员试图从Solarwinds获取动态清单到Ansible。我正在通过rest连接到Solarwinds,并拥有我需要的数据。当我运行脚本时,我得到一个键错误。我不明白为什么,因为我看到它指示的钥匙是错的 代码如下: import os import sys import argparse import ConfigParser try: import json except ImportError: import simplejson as json import r

新手程序员试图从Solarwinds获取动态清单到Ansible。我正在通过rest连接到Solarwinds,并拥有我需要的数据。当我运行脚本时,我得到一个键错误。我不明白为什么,因为我看到它指示的钥匙是错的

代码如下:

import os
import sys
import argparse
import ConfigParser

try:
    import json
except ImportError:
    import simplejson as json

import requests

payload = 'query=SELECT+TOP+10+IPAddress,+Vendor+FROM+Orion.Nodes'
url = "https://10.150.199.44:17778/SolarWinds/InformationService/v3/Json/Query"
req = requests.get(url, params=payload, verify=False, auth=('ansible', 'pass'))

jsonget = req.json()

    def get_list(self):
        hostsData = jsonget
        print "Test json before manipulation:\n"
        print(hostsData)
        print "\n\n"
        if hostsData['Vendor'] == []:
            print ''
        else:
            for rows in hostsData['Vendor']:
                print 'hosts:' + rows['IPAddress']
以下是我的输出:

./swinds.py --list
Test json before manipulation:

{u'results': [{u'Vendor': u'Cisco', u'IPAddress': u'10.150.190.2'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.150.250.3'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.255.255.42'}, {u'Vendor': u'Juniper Networks/NetScreen', u'IPAddress': u'10.58.1.1'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.1'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.2'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.33.93.3'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.4'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.33.93.6'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.7'}]}



Traceback (most recent call last):
  File "./swinds.py", line 75, in <module>
    SwInventory()
  File "./swinds.py", line 41, in __init__
    self.inventory = self.get_list()
  File "./swinds.py", line 57, in get_list
    if hostsData['Vendor'] == []:
KeyError: 'Vendor'
test@ubuntu:/etc/ansible$
/swinds.py--列表
操作前测试json:
{u'results':[{u'Vendor':u'Cisco',u'IPAddress':u'10.150.190.2'},{u'Vendor':u'Cisco',u'IPAddress':u'Vendor':u'Unknown',u'IPAddress':u'10.255.255.42'},{u'Vendor':u'Juniper NetScreen',u'IPAddress':u'10.58.1.1'},{u'Vendor':u'Cisco',u'IPAddress':u'10.33.93'},{u'Vendor':u'Cisco',u'IPAddress':u'10.33.93.2'},{u'Vendor':u'Unknown',u'IPAddress':u'Vendor':u'Cisco',u'IPAddress':u'10.33.93.4'},{u'Vendor':u'Unknown',u'IPAddress':u'10.33.93.6'},{u'Vendor':u'Cisco',u'IPAddress':u'10.33.93.7'}
回溯(最近一次呼叫最后一次):
文件“/swinds.py”,第75行,在
SwInventory()
文件“/swinds.py”,第41行,在__
self.inventory=self.get_list()
文件“/swinds.py”,第57行,在get\u列表中
如果主机数据['Vendor']=[]:
KeyError:“供应商”
test@ubuntu:/etc/ansible$
为什么我会出现这个错误?谢谢你的帮助


CB

您没有JSON对象,您有一个从JSON创建的python字典。我不知道您是如何达到示例中所示的程度的,但是JSON很容易在python列表/目录和实际JSON之间交换。我如何知道它不是JSON?字符串和单引号e前面有unicode
u
。g、
而不是
。归根结底,当您在本地使用Python时,这并不重要,您可以以相同的方式使用它们,但您应该注意它们的区别

您有一个带有一个键的字典:
results
。它作为一个值映射到一个列表(您可以索引),该列表中的每个项目本身就是一个字典。如果要打印
hosts:
和IP地址(如注释中所建议的):


你没有一个JSON对象,你有一个由JSON创建的python字典。我不知道你是如何达到你在例子中所展示的目的的,但是JSON在python列表/目录和实际的JSON之间很容易互换。我怎么知道它不是JSON?字符串和单引号前面有unicode
u
,例如
而不是
。最终,当您在本地使用Python时,这并不重要,您可以以相同的方式使用它们,但您应该注意它们的区别

您有一个带有一个键的字典:
results
。它作为一个值映射到一个列表(您可以索引),该列表中的每个项目本身就是一个字典。如果要打印
hosts:
和IP地址(如注释中所建议的):



@Dmitrypoloskiy不,它是一个存储在
结果
上的列表。因此
hostsData['results'][0]['Vendor']
获得第一个结果。啊,是的,你是对的,没有找到括号你可能在Python 2上。
dict
中的字符串是unicode(由
u
表示)当您试图只检索
'Vendor'
这是一个ASCII编码的字符串,即一系列字节时,请尝试使用
u'Vendor'
。@a_guest,这没有什么区别。问题是OP试图访问嵌套元素,而没有使用适当的键和索引链来获取它。Roganjosh,完全做到了它!我认为结果是问题所在,但不知道如何解释。有一点我不清楚,[0]是做什么的?这是标记吗?您是否有办法解决下一个错误:打印“hosts:”+行[“IPAddress”]TypeError:字符串索引必须为integers@DmitryPolonskiy不,这是一个存储在
结果
上的列表。因此
hostsData['results'][0]['Vendor']
会得到第一个结果。啊,是的,你是对的,错过了括号。你可能在Python 2上。dict中的字符串是unicode(由
u
表示)当您试图只检索
'Vendor'
这是一个ASCII编码的字符串,即一系列字节时,请尝试使用
u'Vendor'
。@a_guest,这没有什么区别。问题是OP试图访问嵌套元素,而没有使用适当的键和索引链来获取它。Roganjosh,完全做到了它!我认为结果是问题所在,但不知道如何解释。有一点我不清楚,[0]是做什么的?这是标记吗?您是否有办法解决下一个错误:打印“hosts:”+行[“IPAddress”]TypeError:字符串索引必须是整数我在我的第一篇文章中添加了如何将数据放入变量hostsData。你所做的工作我试图解决的问题是让主机的输出在Vendor字段中循环。Vendor是组,ipAddress是主机。最后的json必须以某种方式查找Ansible阅读:
code
{“Cisco”:{“hosts”:[“1.1.1.1”、“2.2.2.2”],“vars”:{“a”:true}}
code
在你尝试发布你的代码之前..该网站遵循一问一答的原则。你不能继续扩展问题。我的答案解决了你最初的问题吗?如果是,我将感谢你将其标记为正确以关闭此问题。如果你有进一步的问题,你需要提出一个新问题。我的错。这里是新问题。我知道感谢你的帮助。不用担心:)这只会帮助其他人在谷歌搜索特定问题。我将失去所有连接;如果你仍然面临问题,无法解决并提出一个没有答案的新问题,请推我到这里。否则,祝你好运:)酷。非常感谢。我在最初的帖子中添加了如何将数据输入v你做了什么
hostsData = {u'results': [{u'Vendor': u'Cisco', u'IPAddress': u'10.150.190.2'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.150.250.3'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.255.255.42'}, {u'Vendor': u'Juniper Networks/NetScreen', u'IPAddress': u'10.58.1.1'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.1'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.2'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.33.93.3'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.4'}, {u'Vendor': u'Unknown', u'IPAddress': u'10.33.93.6'}, {u'Vendor': u'Cisco', u'IPAddress': u'10.33.93.7'}]}

for item in hostsData['results']:
    print "Hosts: " + item['IPAddress']