使用.present解析嵌套哈希? - 未定义的方法`[]' for nil:NilClass(NoMethodError)

时间:2014-11-25 02:51:25

标签: ruby hash

***第二次编辑,表明我需要处理多个地点。

EDITED表示即使内置处理程序也会引发异常。

我目前正在解析来自API的回复,其中包含我使用

转换为哈希的数组
hash_table = xml_response.to_h

挑战在于,我所寻找的数据有时位于不同的位置,当我使用关键方法时:

data_i_need = hash_table['key1']['key2'][0]

如果那里什么都没有,就会抛出这个错误:

undefined method `[]' for nil:NilClass (NoMethodError)

我尝试过使用:

if hash_table['key1']['key2'][0].present?
   data_i_need = hash_table['key1']['key2'][0]
   puts "data was here"
elsif hash_table['key3']['key4'][0].present?
   data_i_need = hash_table['key3']['key4'][0]
   puts "data here"
elsif hash_table['key5']['key6'][0].present?
   data_i_need = hash_table['key5']['key6'][0]
   puts "data here"
else 
   "data not found"
end 

但它会引发同样的错误:

undefined method `[]' for nil:NilClass (NoMethodError)

1 个答案:

答案 0 :(得分:0)

你应该检查是否存在所有先前的散列键,因为如果其中一个是nil,则会引发异常

hash_table['key1'].present? && hash_table['key1']['key2'].present? && hash_table['key1']['key2']['key3'].present? && hash_table['key1']['key2']['key3'][0].present?

更新: 要返回“未找到”,您可以捕获这样的异常:

data_i_need = begin 
  hash_table['key1']['key2']['key3'][0] 
rescue NoMethodError
  "data not found" 
end

更新2: 您可以使用此函数来检查密钥是否存在于if else条件语句中的哈希值中:

h = {:a => {:b => {0 => 1}}, :c => 2}

def has_nested_keys?(hash, *keys)
  keys.inject(hash) do |result, key|
    result = result[key]
  end  
  true
rescue 
  false
end

has_nested_keys?(h, :a, :b, 0) #=> true
has_nested_keys?(h, :c, :d, 0) #=> false