[英]Problems querying JSON nested hash response in Ruby
似乎无法解决此问题:
我从Lastfm获取JSON嵌套哈希响应,并且当响应具有以下结构时,一切工作正常:
{"topalbums" =>{"album" =>{"name =>"Friday Night in Dixie"}}}
但是,如果艺术家没有顶级专辑,则响应将以这种方式构造,并且我得到了nil:NilClass的NoMethodError未定义方法'[]'。
{"topalbums" =>{"#text"=>"\n ", "artist"=>"Mark Chestnutt"}}
我想做的就是查询响应,所以我不会一直收到此错误。
这是我的方法:
def get_albums
@albums = Array.new
@artistname.each do |name|
s = LastFM::Artist.get_top_albums(:artist => name, :limit => 1)
r = JSON.parse(s.to_json)['topalbums']['album']['name']
@albums.push(r)
end
end
如果艺术家拥有一张顶级专辑,这正是我想要的。我需要做的是以某种方式添加条件来查询嵌套哈希中的键。 但是,我似乎无法掌握如何执行此操作,就像我添加以下代码行以检查键值时一样:
s.each_key { |key, value| puts "#{key} is #{value}" }
我得到的输出是这样的:
topalbums是
因此,topalbums键没有与之关联的值。
到目前为止,这是我尝试过的:
def get_albums
@albums = Array.new
@artistname.each do |name|
s = LastFM::Artist.get_top_albums(:artist => name, :limit => 1)
if s.has_key?('album') #I know this won't work but how can I query this?
r = JSON.parse(s.to_json)['topalbums']['album']['name']
@albums.push r
else
@albums.push(name << "does not have a top album")
end
end
end
如何解决此问题,以便获得“ Mark Chestnut没有热门专辑”而不是NoMethodError
? 干杯
使用Hash#fetch
默认值,我将执行以下操作:
"album"
键 hash = {"topalbums" =>{"#text"=>"\n ", "artist"=>"Mark Chestnutt"}}
default_album = {"name" => "does not have a top album"}
hash["topalbums"].fetch("album", default_album)["name"]
#=> "does not have a top album"
"album"
键存在 hash = {"topalbums" =>{"#text"=>"\n ", "artist"=>"Mark Chestnutt", "album" => {"name" => "Foo"}}}
hash["topalbums"].fetch("album", default_album)["name"]
#=> "Foo"
因此,如果散列没有"album"
键,则fetch
默认为default_album
否则它将使用找到的键,如第二种情况
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.