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
我有这个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