我試圖解析一個相當大的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