我在JSON文件中有这个称为数据的复杂哈希,就在下面。 我对该领域感兴趣" videoId"
所以我运行了这段代码:
puts data["videoId"]
但我没有结果。在ruby中获取所有videoid的最佳方法是什么?为什么代码不起作用?
{
"etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/2rushbFMdJCgH0PsUecXvdIjrIA\"",
"items": [
{
"etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/SGIvedEKHZeJcInXZg-T4Lde7gE\"",
"id": "TExreW5lbzZYQXYxbm8xakgzM0syQm1nLnhTWTc1cUpfa0lr",
"kind": "youtube#playlistItem",
"snippet": {
"publishedAt": "2018-05-21T16:00:00.000+00:00",
"resourceId": {
"kind": "youtube#video",
"videoId": "xSY75qJ_kIk"
},
"title": "The Key (Wax Trax Mix) - Space Bunny | Surreal [1998]"
}
},
{
"etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/Z7hQMBr8AzIyI7n2LPBnd7AUwjs\"",
"id": "TExreW5lbzZYQXYxbm8xakgzM0syQm1nLmVISWd4c2EzckVz",
"kind": "youtube#playlistItem",
"snippet": {
"publishedAt": "2018-05-18T08:00:00.000+00:00",
"resourceId": {
"kind": "youtube#video",
"videoId": "eHIgxsa3rEs"
}
},
"title": "Coin coin Pata'tribe mix [Old School Tekno Tribe]"
}
},
{
"etag": "\"DuHzAJ-eQIiCIp7p4ldoVcVAOeY/T2xQFVjUHZYJ2FHGa4Yb82yMubc\"",
"id": "TExreW5lbzZYQXYxbm8xakgzM0syQm1nLmgxMFlVSVVxb1lN",
"kind": "youtube#playlistItem",
"snippet": {
"publishedAt": "2018-05-17T16:00:00.000+00:00",
"resourceId": {
"kind": "youtube#video",
"videoId": "h10YUIUqoYM"
},
"title": "Lil Louis 1992.09.25 @ Hacienda"
}
},
答案 0 :(得分:0)
这不是数组,这是一个哈希。要获取所有videoId
,可以使用[Enumerable#map
] items
数组来挖掘值:
data["items"].map { |item| item["snippet"]["resourceId"]["videoId"] }
生成videoId
s。
或者,可以使用Iteraptor
gem来为videoId
s grep:
data.segar(/videoId/) { |*args| puts args.inspect }
答案 1 :(得分:0)
Hash是一个类似字典的唯一键及其值的集合。也称为关联数组,它们类似于数组,但是当数组使用整数作为索引时,哈希允许您使用任何对象类型。
当然,值可以是任何对象 - 字符串,方法,零,数字,对象。因此,只有在创建之后,我们才能知道保存在哈希中。因此,在尝试获取所有密钥时:
1 2 435
22 3 384
没有任何嵌套密钥。因此,通过缺少键返回data.keys # => ["etag", "items"]
来找到价值。
要选择所有videoId,您必须执行以下操作:
nil
此外,您可以将Hash类更新为there:
data["items"].map { |item| item["snippet"]["resourceId"]["videoId"] }.compact
然后运行
class Hash
def deep_find(key, object=self, found=nil)
if object.respond_to?(:key?) && object.key?(key)
return object[key]
elsif object.is_a? Enumerable
object.find { |*a| found = deep_find(key, a.last) }
return found
end
end
end
当json具有可变结构时,该方法可以避免错误。