PYTHON3 |解析JSON |索引超出范围|可以';t访问数组的第一列

PYTHON3 |解析JSON |索引超出范围|可以';t访问数组的第一列,json,python-3.x,list,dictionary,indexoutofrangeexception,Json,Python 3.x,List,Dictionary,Indexoutofrangeexception,我有这个JSON(我不给你全部的东西,因为它太长了,但你不需要剩下的。) 我要做的是打印此cve的供应商名称。 所以,我所做的是: with open("nvdcve-1.0-2018.json", "r") as file: data = json.load(file) increment = 0 number_cve = data["CVE_data_numberOfCVEs"] while increment < int(number_cve):

我有这个JSON(我不给你全部的东西,因为它太长了,但你不需要剩下的。)

我要做的是打印此cve的供应商名称。 所以,我所做的是:

with open("nvdcve-1.0-2018.json", "r") as file:
    data = json.load(file)
    increment = 0
    number_cve = data["CVE_data_numberOfCVEs"]
    while increment < int(number_cve):
        print (data['CVE_Items'][increment]['cve']['CVE_data_meta']['ID'])
        print (',')
        print (data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'])        
        print ("\n")
        increment += 
而不是
打印(数据['CVE\u Items'][增量]['CVE']['impact']['vendor']['vendor\u data'][0]['vendor\u name'])

而只进行一次迭代是非常令人厌恶的:s,但至少,值是我想要的数据['CVE_Items'][a]['CVE']['impacts']['vendor']['vendor_data'][0]


有人知道吗?

确保每个
CVE\u商品
都有
vender\u数据

例如:

with open("nvdcve-1.0-2018.json", "r") as file:
    data = json.load(file)
    increment = 0
    number_cve = data["CVE_data_numberOfCVEs"]
    while increment < int(number_cve):
        print (data['CVE_Items'][increment]['cve']['CVE_data_meta']['ID'])
        print (',')
        if (len(data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data']) > 0) :
            print (data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'])        
        print ("\n")
        increment += 
以open(“nvdcve-1.0-2018.json”,“r”)作为文件:
data=json.load(文件)
增量=0
数字=数据[“cve数据”\u数字]
当增量
多亏了Ron Nabuurs的回答,我发现我所有的供应商数据并不总是有供应商名称。因此,这就是为什么是作品而不是印刷品。 (用于检查对象是否为非null,否则将停止)

所以我所做的是:

            try:
                print (data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'])
                print (',')
            except:
                pass

您确定每个
CVE\u项目
都有一个
供应商数据
?因为如果你对中的值使用
,而遇到一个为空的值,它就会忽略它。这就解释了为什么这个解决方案有效哦,我只是看到我有4337个供应商的数据,但只有3107个供应商的名称。它可以解释这件事是的。非常感谢。那么,我是否应该捕获异常并继续使用print方法(而不是for)?我真的不习惯Pyton。我有点怀疑,错误只是因此,您可以继续使用
[0]
选择
供应商名称。因此,首先检查它是否不是空的,或者数组的长度是否大于0,然后就可以了
with open("nvdcve-1.0-2018.json", "r") as file:
    data = json.load(file)
    increment = 0
    number_cve = data["CVE_data_numberOfCVEs"]
    while increment < int(number_cve):
        print (data['CVE_Items'][increment]['cve']['CVE_data_meta']['ID'])
        print (',')
        if (len(data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data']) > 0) :
            print (data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'])        
        print ("\n")
        increment += 
            try:
                print (data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'])
                print (',')
            except:
                pass