2017-09-08 11 views
0

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

+0

您可以添加其他相關代碼嗎? –

+0

@ruby_newbie添加了其餘部分。 – Godzilla74

回答

0

這裏的問題是幾乎所有的參考文獻中都使用了靜態索引0。這條線將只搶到第一vendor_data,尋找它的名字,不管vendor_data多少是數組中,因爲你使用['vendor_data'][0]

vendor_name = d['cve']['affects']['vendor']['vendor_data'][0]['vendor_name'] 

這下一行,同樣,只有通過第一的['product']['product_data']循環供應商,因爲['vendor_data'][0]vendor_data

product_name = d['cve']['affects']['vendor']['vendor_data'][0]['product']['product_data'].each do |n| 

最後,下面一行將在['product']['product_data']爲每個產品跑一次,但永遠只能得到['version']['version_data']的第一個產品在它(並永遠只在第一在['vendor_data']供應商):

versions = d['cve']['affects']['vendor']['vendor_data'][0]['product']['product_data'][0]['version']['version_data'].each do |v| 

你可能想要做的就是通過所有在場的陣列改變一切,以循環,而不用擔心具體指標是什麼,是這樣的:

data['CVE_Items'].each do |d| 
    # identifying CVE code (use this for lookup with exploit db?) 
    cve_id = d['cve']['CVE_data_meta']['ID'] 

    d['cve']['affects']['vendor']['vendor_data'].each do |vendor| 
    vendor_name = vendor.fetch('vendor_name', "Unknown") 

    vendor['product']['product_data'].each do |product| 
     product_info = { 
     'product_name' => product.fetch('product_name', 'Unknown'), 
     'versions' => [] 
     } 

     product['version']['version_data'].each do |version| 
     product_info['versions'] << "#{version['version_affected']} #{version['version_value']}," 
     end 

     product_affected << "#{product_info}" 
    end 
    end 
end 

似乎是工作,對我的未經訓練的系統眼睛。我已經從示例中刪除了所有不相關的代碼,如果在發佈的示例之外需要這些代碼,則只需要將它們添加回來。

相關問題