PYTHON3 |解析 JSON |索引超出范围 |无法访问数组的第一列

PYTHON3 | Parsing JSON | index out of range | can't access to 1st column of an array

我有这个JSON(我没有给你全部,因为它太长了,但你不需要其余的。)

cve" : {
 "data_type" : "CVE",
 "data_format" : "MITRE",
 "data_version" : "4.0",
 "CVE_data_meta" : {
   "ID" : "CVE-2018-9991",
   "ASSIGNER" : "cve@mitre.org"
 },
 "affects" : {
   "vendor" : {
     "vendor_data" : [ {
       "vendor_name" : "frog_cms_project",
       "product" : {
         "product_data" : [ {
           "product_name" : "frog_cms",
           "version" : {
             "version_data" : [ {
               "version_value" : "0.9.5"
             } ]
           }
         } ]
       }
     } ]
   }
 },

我想做的是打印这个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 += 

我做了一段时间的原因是因为在JSON文件中,有很多CVE,所以我做了data['CVE_Items'][increment]['cve'](这部分工作正常,`print(data['CVE_Items'][increment]['cve']['CVE_data_meta']['ID'] 行工作良好) .

我的错误在 print (data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data'][0]['vendor_name']) 行,python returns 列表索引超出范围错误。

但是如果我正在阅读这个 JSON 好,vendor_data 是一个 1 列的数组,所以 vendor_name 是 ['vendor_data'][0]['vendor_name'] 不是吗?

解析我发现的 vendor_name 的唯一方法是:

for value in data['CVE_Items'][a]['cve']['affects']['vendor']['vendor_data']:
    print (value['vendor_name'])

而不是print (data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'])

并且只为一次迭代做一次是非常恶心的:s,但至少,价值是数据['CVE_Items'][a]['cve']['affects' ]['vendor']['vendor_data'][0] 我想要....

有人知道吗?

确保每个 CVE_Item 都有一个 vender_data

示例:

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 += 

感谢 Ron Nabuurs 的回答,我发现我所有的 vendor_data 并不总是 vendor_name。所以这就是为什么 for 有效而不是打印的原因。 (for 检查对象是否为非空,否则停止)。

所以我所做的是:

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