我试图解析一个相当大的JSON文件,现在正在尝试创建一个哈希数组,我可以在稍后进行我的Rails UI分析。向Ruby中的数组添加散列只有一次
(试图只添加相关的JSON)
{
"CVE_data_type" : "CVE",
"CVE_data_format" : "MITRE",
"CVE_data_version" : "4.0",
"CVE_data_numberOfCVEs" : "2203",
"CVE_data_timestamp" : "2017-09-08T16:01Z",
"CVE_Items" : [ {
"cve" : {
"CVE_data_meta" : {
"ID" : "CVE-2006-0441"
},
"affects" : {
"vendor" : {
"vendor_data" : [ {
"vendor_name" : "automatedlogic",
"product" : {
"product_data" : [ {
"product_name" : "webctrl",
"version" : {
"version_data" : [ {
"version_value" : "5.5",
"version_affected" : "<="
}, {
"version_value" : "5.2",
"version_affected" : "<="
}, {
"version_value" : "6.1",
"version_affected" : "<="
}, {
"version_value" : "6.5",
"version_affected" : "<="
}, {
"version_value" : "6.0",
"version_affected" : "<="
} ]
}
}, {
"product_name" : "i-vu",
"version" : {
"version_data" : [ {
"version_value" : "5.2",
"version_affected" : "<="
}, {
"version_value" : "5.5",
"version_affected" : "<="
}, {
"version_value" : "6.0",
"version_affected" : "<="
}, {
"version_value" : "6.5",
"version_affected" : "<="
} ]
}
}, {
"product_name" : "sitescan_web",
"version" : {
"version_data" : [ {
"version_value" : "5.5",
"version_affected" : "<="
}, {
"version_value" : "6.5",
"version_affected" : "<="
}, {
"version_value" : "5.2",
"version_affected" : "<="
}, {
"version_value" : "6.1",
"version_affected" : "<="
} ]
}
} ]
}
} ]
}
},
我已经能够建造这个,但是我不知道它是如何想出了不正确version
值。此外,它的创建相同的条目3次(我假设,因为有3个product_name
值:
["{\"product_name\"=>\"webctrl\", \"versions\"=>[\"<= 5.5,\", \"<= 5.2,\", \"<= 6.1,\", \"<= 6.0,\"]}", "{\"product_name\"=>\"i-vu\", \"versions\"=>[\"<= 5.5,\", \"<= 5.2,\", \"<= 6.1,\", \"<= 6.0,\"]}", "{\"product_name\"=>\"sitescan_web\", \"versions\"=>[\"<= 5.5,\", \"<= 5.2,\", \"<= 6.1,\", \"<= 6.0,\"]}"]
["{\"product_name\"=>\"webctrl\", \"versions\"=>[\"<= 5.5,\", \"<= 5.2,\", \"<= 6.1,\", \"<= 6.5,\", \"<= 6.0,\"]}", "{\"product_name\"=>\"i-vu\", \"versions\"=>[\"<= 5.5,\", \"<= 5.2,\", \"<= 6.1,\", \"<= 6.5,\", \"<= 6.0,\"]}", "{\"product_name\"=>\"sitescan_web\", \"versions\"=>[\"<= 5.5,\", \"<= 5.2,\", \"<= 6.1,\", \"<= 6.5,\", \"<= 6.0,\"]}"]
["{\"product_name\"=>\"webctrl\", \"versions\"=>[\"<= 5.5,\", \"<= 6.1,\", \"<= 5.2,\", \"<= 6.5,\", \"<= 6.0,\"]}", "{\"product_name\"=>\"i-vu\", \"versions\"=>[\"<= 5.5,\", \"<= 6.1,\", \"<= 5.2,\", \"<= 6.5,\", \"<= 6.0,\"]}", "{\"product_name\"=>\"sitescan_web\", \"versions\"=>[\"<= 5.5,\", \"<= 6.1,\", \"<= 5.2,\", \"<= 6.5,\", \"<= 6.0,\"]}"]
你会发现值不生JSON和输出之间的关联,而不管product_name
值始终跻身阵列中的每个散列返回的3个款产品相同
这里是我的代码:
data['CVE_Items'].each do |d|
# setups up needed arrays
reference_data = []
product_names = []
product_info = Hash.new
# identifying CVE code (use this for lookup with exploit db?)
cve_id = d['cve']['CVE_data_meta']['ID']
# vendor name of the product, defaults to 'Unknown' if not found
vendor_name = d['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'] rescue "Unknown"
begin
product_name = d['cve']['affects']['vendor']['vendor_data'][0]['product']['product_data'].each do |n|
product_info = Hash.new
product_info['product_name'] = n['product_name'] rescue "Unknown"
versions_affected = []
versions = d['cve']['affects']['vendor']['vendor_data'][0]['product']['product_data'][0]['version']['version_data'].each do |v|
versions_affected << "#{v['version_affected']} #{v['version_value']},"
end
product_info['versions'] = versions_affected
product_affected << "#{product_info}"
end
rescue
"Unknown"
end
end
puts product_affected
我试图使代码灵活,因为一些JSON输出(不包括) ly有1个产品,1个版本等。
另外,有没有更好的方式来遍历一个product_name
并得到我需要的并行version
信息?
您可以添加其他相关代码吗? –
@ruby_newbie添加了其余部分。 – Godzilla74