代码之家  ›  专栏  ›  技术社区  ›  Godzilla74

在Ruby中只向数组添加一次哈希

  •  0
  • Godzilla74  · 技术社区  · 8 年前

    我正试图解析一个相当大的JSON文件,现在正试图创建一个哈希数组,我可以稍后让我的Rails UI解析。

    (尝试只添加相关的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和输出之间没有关联,而且无论 产品名称 数组中每个哈希中返回的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
    

    产品名称 并获得平行结果 版本 我需要的信息?

    1 回复  |  直到 8 年前
        1
  •  0
  •   Simple Lime    8 年前

    0 在你几乎所有的参考资料中。这条线只能抓住第一条 vendor_data 并寻找它的名字,不管有多少 在该数组中,因为您使用 ['vendor_data'][0] :

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

    这下一行,再次,只循环通过 ['product']['product_data'] 供应商数据 因为 ['vendor\u data'][0] :

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

    最后,下一行将为中的每个产品运行一次 但只有得到 ['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