2017-09-08 35 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 

似乎是工作,对我的未经训练的系统眼睛。我已经从示例中删除了所有不相关的代码,如果在发布的示例之外需要这些代码,则只需要将它们添加回来。

相关问题