PYTHON3 |Разбор JSON |индекс вне диапазона |не может получить доступ к 1-му столбцу массива - PullRequest
0 голосов
/ 08 июня 2018

У меня есть этот 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, поэтому я сделал данные ['CVE_Items'] [инкремент]['cve'] (и эта часть работает нормально, строка `print (data ['CVE_Items'] [increment] ['cve'] ['CVE_data_meta'] ['ID'] работает хорошо).

Моя ошибка в строке print (data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data'][0]['vendor_name']), pyhton выдает мне индекс списка вне ошибки диапазона.

Но если я хорошо читаю этот 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'] ['влияет на'] ['vendor']['vendor_data'] [0], который я хотел ....

Кто-нибудь что-нибудь знает об этом?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Благодаря ответу Рона Набуурса я обнаружил, что все мои vendor_data не всегда имеют vendor_name.Так вот почему для работ, а не для печати.(для проверки, если объект не нулевой, иначе он останавливается).

Итак, что я сделал:

            try:
                print (data['CVE_Items'][increment]['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'])
                print (',')
            except:
                pass
0 голосов
/ 08 июня 2018

Убедитесь, что у каждого 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 += 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...