0

我正在尝试读取从 REST API 收到的一些 JSON,但遇到了一些问题。

为了获取我的 JSON,我使用了 Open::URI。我创建了这样的请求:

require "open-uri"
require "json"
content = open("http://foo.bar/test.json").read
result = JSON.parse(content)

此时我的 JSON 应该是从字符串中解析出来的,所以如果我理解正确,假设我收到的 JSON 具有如下结构,则构建包含我的 JSON 的哈希:

{
   "root":
   {
       "foos":
       {
           "1":
           {
               "title" : "zero",
               "number" : 0
           },
           "2":
           {
               "title" : "twenty",
               "number" : 20
           },
           ...
       }
    }
}

我想遍历每一个foos,并为它们中的每一个获取标题和编号。我试过这个:

content["root"]["foos"].each do |foo| puts foo.title + " " + foo.number end

但是,作为输出,我得到:

#<Enumerator:0x007fceb8b33718>

我的错误在哪里?

提前致谢,

4

2 回答 2

1

这是一个选项...迭代foos对象内部的键。

json = JSON.parse(your_sample_json)
 => {"root"=>{"foos"=>{"1"=>{"title"=>"zero", "number"=>0}, "2"=>{"title"=>"twenty", "number"=>20}}}}

foos = json["root"]["foos"]
 => {"1"=>{"title"=>"zero", "number"=>0}, "2"=>{"title"=>"twenty", "number"=>20}}

foos.keys.each { |key| puts foos[key]["title"] }
zero
twenty

此外,如果您可以控制正在解析的 JSON 对象,则可以创建foos一个数组而不是一堆编号的对象。

于 2013-08-25T00:28:39.683 回答
1

我会这样做:

require 'json'
require 'pp'

hash = JSON.parse(
  '{
    "root": {
      "foos": {
        "1": {
          "title": "zero",
          "number": 0
        },
        "2": {
          "title": "twenty",
          "number": 20
        }
      }
    }
  }'
)

results = hash['root']['foos'].map{ |k, v|
  [v['title'], v['number']]
}

pp results

运行后输出一个数组数组:

[["zero", 0], ["twenty", 20]]

map可能与您对哈希的预期有所不同;它将散列的每个键/值分配为两个元素的数组。键是第一个元素,值是第二个。因为您的结构是散列的散列的散列的散列,当迭代hash['root']['foos']键的值时,"1"并且"2"是散列,因此您可以像访问散列一样访问它们的值。

回到你的代码:

hash["root"]["foos"].each do |foo|
  puts foo.title + " " + foo.number
end

不会工作。它根本不返回枚举数,因此部分问题是不准确的。您的代码返回的是:

undefined method `title' for ["1", {"title"=>"zero", "number"=>0}]:Array (NoMethodError)
于 2013-08-25T02:22:15.337 回答