{"album" =>{"name =>"Friday Nig-6ren">
gpt4 book ai didi

ruby-on-rails - 在 Ruby 中查询 JSON 嵌套哈希响应的问题

转载 作者:数据小太阳 更新时间:2023-10-29 08:38:05 27 4
gpt4 key购买 nike

似乎无法解决这个问题:

我从 Lastfm 获得 JSON 嵌套哈希响应,当响应是这样的结构时,一切正常:

{"topalbums" =>{"album" =>{"name =>"Friday Night in Dixie"}}}

但是,如果艺术家没有顶级专辑,则响应以这种方式构建,我会得到一个 NoMethodError undefined method '[]' for nil:NilClass。

{"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 is

所以 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,否则它会使用它在第二种情况

关于ruby-on-rails - 在 Ruby 中查询 JSON 嵌套哈希响应的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22270960/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com