如何避免"未定义的方法`[]'为零:NilClass"使用嵌套的Ruby哈希时?

时间:2016-01-12 01:00:42

标签: ruby json api hash

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

我已将JSON解析为哈希值。

当我尝试选择嵌套在" data"内的任何哈希值时我收到一个"未定义的方法`[]'为零:NilClass"错误。

puts可以res["240"]["data"]使用res["240"]["data"]["type"] 向我展示所有的键和值。所有这些看起来都很好。

然而,当我尝试进一步分支时,它会抛出零。

.key

使用res["240"]["data"].key 也会引发错误。

ToUniveralTime

我寻求答案的主要内容主要是找到了搜索密钥和答案的建议。价值,但我知道数据的直接路线,所以我想尽可能走这条路。

感谢。

3 个答案:

答案 0 :(得分:4)

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

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

然后你可以res.dig("240", "data", "type")

答案 1 :(得分:3)

您可以将digsafe navigation operator结合使用,例如:

res&.dig("240", "data", "type")

如果resnil(或更准确地说是“ dig不可行”),它将返回nil而不是加注。

答案 2 :(得分:1)

使用dig

res.dig("240", "data", "type")