使用嵌套的 Ruby 哈希时,如何避免“nil:NilClass 的未定义方法‘[]’”?

gri*_*rim 2 ruby api hash json

我正在使用 Steam Storefront API - http://store.steampowered.com/api/appdetails/?appids=240

我已将 JSON 解析为哈希。

当我尝试选择嵌套在“数据”中的任何哈希值时,我收到一个“未定义的方法`[]' for nil:NilClass”错误。

我可以putsres["240"]["data"]它向我展示所有的键和值。所有这些看起来都很好。

但是,当我尝试进一步移动一个分支时,它会抛出零。

res["240"]["data"]["type"]
Run Code Online (Sandbox Code Playgroud)

使用.key也会引发错误。

res["240"]["data"].key
Run Code Online (Sandbox Code Playgroud)

我寻求答案的主要是找到了搜索键和值的建议,但是我知道数据的直接路径,所以如果可能的话,我想走这条路。

谢谢。

par*_*460 5

如果您使用的是 ruby​​ 2.3,则可以dig按照@sawa 的建议使用。

http://docs.ruby-lang.org/en/2.3.0/Hash.html#method-i-dig

但是,如果您使用的不是 ruby​​ 2.3,那么事情会变得有点棘手。

最简单的方法是实现你自己的 dig 版本:

class Hash
  def dig(*path)
    path.inject(self) do |h, k|
      h.respond_to?(:keys) ? h[k] : nil
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

那么你就可以 res.dig("240", "data", "type")