2014-11-25 34 views
0

*** EDITED第二次表明我需要处理在多个位置查找。使用.present解析嵌套哈希? - 未定义的方法`[]'为零:NilClass(NoMethodError)

编辑,以显示例外的提高,即使内置处理器。

我目前通过响应解析来自包括我已经转换成一个散列数组的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) 
+0

您是否考虑过使用Nokogiri和XPath直接处理XML?可能比试图通过一堆嵌套的Hashes更容易。 – 2014-11-25 03:15:04

+0

如果更容易,我会很高兴。 – 2014-11-25 04:30:14

回答

0

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

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: 如果在如果在散存在的键,您可以使用此功能检查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 
+0

嗨武 - 我意识到我应该澄清,即使在上面(编辑)的情况下,我介绍的逻辑,它仍然引发了例外。 – 2014-11-25 03:04:42

+0

如果它没有找到它,我需要它看看别处。如果它找不到它,我需要它告诉我“找不到”,然后继续。 – 2014-11-25 03:05:15

+0

在这种情况下,你可以试试这个: data_i_need =开始 hash_table [ 'key1的'] [ '密钥2'] [ 'KEY3'] [0] 救援 “数据未找到” 结束 – 2014-11-25 03:07:32

相关问题