2014-10-10 45 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"]