2014-10-10 81 views
1

我有一個看起來是這樣的一個響應字符串:如何遍歷JSON數組以獲取鍵的值?

"[{\"id\":\"blahbla23sdlkjrwer2345\",\"name\":\"bar\"},{\"id\":\"aselrjdsfsomething\",\"name\":\"foo\"}]" 

然後我用JSON.parse(response_above)

json_parse = JSON.parse(response_above) 

=>[{"id"=>"blahbla23sdlkjrwer2345", "name"=>"bar"}, 
{"id"=>"aselrjdsfsomething", "name"=>"foo"}] 

在這裏,我只想名字,並把它們放到一個數組。我想出瞭如何獲取名稱,但不知道如何將其構建到新陣列中。

得到的只是「富」或「 - 」我可以這樣做:

json_parse[0].fetch("name") 
=> "bar" 

json_parse[1].fetch("name") 
=> "foo" 

我不如何​​通過數組迭代建立從像JSON響應一個新的數組:

new_array = ["foo", "bar"] 

JSON響應可以是動態的,有時我可能只有2個元素,其他時間我可以有10個元素。我不能硬編碼一個值。我需要找到一種方法來遍歷數組中的「name」鍵來獲取每個值。

+0

我的回答有幫助嗎? – Anthony 2014-10-13 16:59:18

回答

1

像許多紅寶石答案有幾個方法可以做到這一點:

設置:

[1] pry(main)> require 'json' 
=> true 
[2] pry(main)> json = JSON.parse("[{\"id\":\"blahbla23sdlkjrwer2345\",\"name\":\"bar\"},{\"id\":\"aselrjdsfsomething\",\"name\":\"foo\"}]") 

使用#inject

[5] pry(main)> json.inject([]) { |arr, entry| arr << entry['name'] ; arr } 
=> ["bar", "foo"] 

使用#map爲Nerian指出:

[6] pry(main)> json.map { |entry| entry['name'] } 
=> ["bar", "foo"] 

使用#collect

[7] pry(main)> json.collect { |entry| entry['name'] } 
=> ["bar", "foo"] 

一些有趣的基準關於這個問題爲好。我創建了一個包含一百萬個散列的數組,並在其上面調用了上面的三個方法。 #collect似乎是最快的,儘管測試從運行到運行有一點變化。

 user  system  total  real 
map 0.300000 0.020000 0.320000 ( 0.325673) 
collect 0.260000 0.030000 0.290000 ( 0.285001) 
inject 0.430000 0.010000 0.440000 ( 0.446080) 
5

方法如下:

2.1.3 :006 > require 'json' 
=> true 
2.1.3 :007 > json = JSON.parse("[{\"id\":\"blahbla23sdlkjrwer2345\",\"name\":\"bar\"},{\"id\":\"aselrjdsfsomething\",\"name\":\"foo\"}]") 
=> [{"id"=>"blahbla23sdlkjrwer2345", "name"=>"bar"}, {"id"=>"aselrjdsfsomething", "name"=>"foo"}] 
2.1.3 :008 > json.map { |entry| entry['name'] } 
=> ["bar", "foo"]