如何遍历JSON数组以获取键的值?

时间:2014-10-10 21:51:05

标签: ruby-on-rails ruby arrays 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"}]

从这里我只想要名字并将它们放入一个数组中。我想出了如何获取名称但不知道如何将其构建为新数组。

要获得“foo”或“bar”,我可以这样做:

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

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

我不知道如何遍历数组以从JSON响应构建新数组,如:

new_array = ["foo", "bar"]

JSON响应可以是动态的,有时我可能只有2个元素,有时我可以有10个元素。我无法对一个值进行硬编码。我需要找到一种方法来遍历该数组,以获取每个值的“name”键。

2 个答案:

答案 0 :(得分:6)

以下是:

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"] 

答案 1 :(得分:3)

与许多Ruby答案一样,有几种方法可以做到:

设置:

[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"]

关于这个主题的一些有趣的基准。我创建了一个包含一百万个哈希的数组,并在其上调用了上面的3个方法。 #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)