我正在尝试阅读从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>
我的错误在哪里?
提前致谢,
答案 0 :(得分: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
成为一个数组而不是一堆编号的对象。
答案 1 :(得分: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)