【问题标题】:How to avoid "undefined method `[]' for nil:NilClass" when working with nested Ruby hashes?使用嵌套 Ruby 哈希时如何避免“nil:NilClass 的未定义方法 `[]'”?
【发布时间】:2016-01-12 01:00:41
【问题描述】:

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

我已将 JSON 解析为哈希。

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

我可以通过res["240"]["data"]puts 进行全部操作,它向我展示了所有的键和值。所有这些看起来都很好。

但是,当我尝试再往前走一个分支时,它会抛出 nil。

res["240"]["data"]["type"]

使用.key 也会引发错误。

res["240"]["data"].key

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

谢谢。

【问题讨论】:

    标签: ruby json api hash


    【解决方案1】:

    如果您使用的是 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")

    【讨论】:

    • @sawa 回答有效,但是感谢您考虑到我可能还没有 2.3。很幸运他们在我需要它之前发布了“挖掘”:)
    【解决方案2】:

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

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

    如果resnil(或更准确地说不是“digable”),那么它将返回nil 而不是提升。

    【讨论】:

      【解决方案3】:

      使用dig

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

      【讨论】:

      • nil 没有实现 .dig: [3] pry(main)> nil.dig("240", "data", "type") NoMethodError: undefined method 'dig' for nil:NilClass
      • @tomsabin 那又怎样?这与问题有什么关系?
      • 我对这个问题的误解——认为res 原本是nil。
      • 引用问题:“我已将 JSON 解析为 hash。”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多