【问题标题】:How to iterate through an JSON array to get a value of a key?如何遍历 JSON 数组以获取键的值?
【发布时间】:2014-10-10 21:51:05
【问题描述】:

我有一个看起来像这样的响应字符串:

"[{\"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 个元素。我无法硬编码一个值。我需要找到一种方法来遍历该数组,以获取每个值的“名称”键。

【问题讨论】:

  • 我的回答有帮助吗?

标签: ruby-on-rails ruby arrays json


【解决方案1】:

方法如下:

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

【讨论】:

    【解决方案2】:

    像许多 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2017-08-30
      相关资源
      最近更新 更多