2014-11-25 73 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

相關問題