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

在使用嵌套Ruby哈希时,如何避免“nil:NilClass的未定义方法”[]?,ruby,json,api,hash,Ruby,Json,Api,Hash,我正在使用Steam Storefront API- 我已将JSON解析为哈希 当我尝试选择嵌套在数据中的任何哈希值时,我收到一个未定义的nil:NilClass错误方法“[]” 我可以用res[240][data]来显示所有的键和值。所有这些看起来都不错 然而,当我试着去一个分支进一步它抛出零 res["240"]["data"]["type"] 使用.key也会抛出一个错误 res["240"]["data"].key 我寻找答案的过程主要是寻找关键字和值的建议,但是我知道数据的直接路线

我正在使用Steam Storefront API-

我已将JSON解析为哈希

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

我可以用res[240][data]来显示所有的键和值。所有这些看起来都不错

然而,当我试着去一个分支进一步它抛出零

res["240"]["data"]["type"]
使用.key也会抛出一个错误

res["240"]["data"].key
我寻找答案的过程主要是寻找关键字和值的建议,但是我知道数据的直接路线,所以如果可能的话,我想走这条路线

谢谢。

使用挖掘


如果您使用的是ruby 2.3,那么您可以按照@sawa的建议使用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.dig240,data,键入

您可以将dig与如下组合使用:


如果res为零或更准确地说是不可挖掘的,那么它将返回零而不是提升。

@sawa-answer有效,但是感谢您考虑到我可能还没有2.3。幸运的是,他们在我需要dig之前发布了它:nil没有实现。dig:[3]prymain>nil.dig240,数据,类型NoMethodError:nil的未定义方法“dig”:NilClass@tomsabin那又怎么样?这与这个问题有什么关系?我对这个问题的误解——认为res最初是nil。引用问题:我已经将JSON解析为哈希。
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")