2017-09-08 15 views
0

かなり大きなJSONファイルを解析しようとしていますが、後でRails UIの構文解析を行うことができるハッシュの配列を作成しようとしています。 Rubyの配列にハッシュを一度だけ追加する

は、しかし、私はそれが間違っ version値を考え出すだかわからないんだけど、私はこれを構築することができました

{ 
    "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" : "<=" 
        } ] 
       } 
       } ] 
      } 
      } ] 
     } 
     }, 

(のみ関連JSONを追加しようとしています)。

["{\"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つのproduct_name値があるので、3回同じエントリを作成しています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出力の一部以来のコードを柔軟にしようとしています(含まれていない)on 1つの製品、1つのバージョンなどがあります

また、product_nameを繰り返し処理し、必要な情報をversionに取得する方法がありますか?

+0

関連するコードの残りを追加できますか? –

+0

@ruby_newbieが残りを追加しました。 – Godzilla74

答えて

0

ここでの問題は、ほぼすべての参照で静的インデックス0を使用していることです。

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

この次の行は、再び、最初の['product']['product_data']をループ:この行は今までに関係なく、あなたが['vendor_data'][0]を使用しているためvendor_dataは、その配列内にあるどのように多くの、最初のvendor_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 

があると思われます私の訓練されていないあなたのシステムの目に、働いています。サンプルから無関係なコードをすべて削除しましたが、投稿されたサンプルの外にそれらが必要な場合は、再度追加する必要があります。

関連する問題