2014-06-12 25 views
0

代碼:簡單的JSON在Ruby中不工作

#!/usr/bin/ruby 
require 'rubygems' 
require 'open-uri' 
require 'json' 

def getData 
    file = open("http://goo.gl/BI6h7a") 
    @json = JSON.parse(file.read) 
end 

getData 

cveIds = @json['cve_id'] 
puts cveIds 

這裏你可以看到JSON響應:http://goo.gl/BI6h7a

控制檯:

./cve.rb:13:in `[]': can't convert String into Integer (TypeError) from ./cve.rb:13:in `<main>' 

我不知道爲什麼會這樣。 「將字符串轉換爲整數」?什麼?

@json獲得的內容很好,但cveIds沒有。

+0

用最簡單的話來說。 'JSON.parse(file.read)'返回記錄數組。所以把它解析爲數組,你完成了 –

回答

2

在JSON頂部的元素,你正在閱讀實際上是一個Array,它的每個元素實際上是一個散列,就像這樣:

[ 
    { 
     "cve_id": "CVE-2014-3976" 
     // other key/value pairs 
    } 
    { 
     "cve_id": "CVE-2014-3975" 
     // other key/value pairs 
    } 
    { 
     "cve_id": "CVE-2014-3974" 
     // other key/value pairs 
    } 
    // .... more hashes 
] 

所以@json是一個數組。如果您要訪問的任何元素,你有一個數值整數指數喜歡訪問它,所以:

@json[0] # => { "cve_id": "CVE-2014-3976", // other key/value pairs } 

我認爲你正在試圖收集所有這些哈希的cve_id領域,這樣可以完成如下:

cveIds = @json.collect { |h| h["cve_id"] } 

# The result: 
=> ["CVE-2014-3976", "CVE-2014-3975", "CVE-2014-3974", "CVE-2014-3962", "CVE-2014-3961", 
"CVE-2014-3878", "CVE-2014-3871", "CVE-2014-3842", "CVE-2014-3806", "CVE-2014-3792", 
"CVE-2014-3791", "CVE-2014-3443", "CVE-2014-3247", "CVE-2014-3246", "CVE-2014-3225", 
"CVE-2014-3216", "CVE-2014-3139", "CVE-2014-3138", "CVE-2014-3008", "CVE-2014-2996", 
"CVE-2014-2994", "CVE-2014-2976", "CVE-2014-2850", "CVE-2014-2847", "CVE-2014-2671", 
"CVE-2014-2668", "CVE-2014-2588", "CVE-2014-2587","CVE-2014-2586", "CVE-2014-2579"] 
+0

謝謝,它正在工作。這個'.collect'遍歷數組並創建一個var'h'並獲取每個ID,對吧? – JChris

+0

@Juan'Array'的'.collect'方法將迭代,並且在每次迭代中'h'是當前元素的名稱。 'collect'的結果是一個新數組,它的值是每次迭代返回的值,在我們的例子中是'h [「cve_id」]'。你需要練習它以更好地理解它:) [數組收集實例方法](http://www.ruby-doc.org/core-2.1.2/Array。html#method-i-collect) –

+0

這就是我在這裏做的,練習,創造一些「無所事事」的程序。謝謝 (: – JChris

1

我不是ruby開發者,但是你有什麼是字典的列表。 我的猜測是爲了讓你閱讀cve_id你需要創建某種for循環。

例如python我會寫這樣的:

for line in my_data: 
    print line['cve_id'] 

我想在紅寶石它應該是這樣的:

for i in @json do 
    cveIds = i['cve_id'] 
    puts cveIds 
end 
1
cveIds = @json['cve_id'] 

你在這裏做的是等價於:

arr = [1, 2, 3, 4] 
puts arr["hello"] # using a string here on an indexed based array! 

因此,有關Ruby嘗試將String轉換爲int的錯誤消息。

嘗試使用以下代替

cveIds = @json.first['cve_id'] # equivalent to @json[0]['cve_id'] 
puts cveIds 

在上面的代碼示例中,我們得到從陣列,這是一種散列那麼我們可以從訪問cve_id第一個元素。