2012-08-24 12 views
1

我有一組具有多級數據的JSON數據。在JSON的片段(忽略缺失的格式請):在多級JSON數據的rails中使用has_key

DATA SET A: 
"interaction": { 
    "author": { 
     "username": "johndoe", 
     "name": "John Doe" 
    } 
}, 
"gender": "male" 

DATA SET B: 
"interaction": { 
    "author": { 
     "name": "Jane Doe" 
    } 
}, 
"gender": "male" 

在單級我可以使用:

if record.has_key?('gender') 

,如果關鍵是存在將返回真/假值。

如果我嘗試播種數據並且鍵不存在,它將拋出錯誤並停止播種。

我的問題:如何檢查「用戶名」鍵是否存在。例如,數據集B沒有用戶名密鑰,會引發錯誤,但我無法弄清楚如何修改has_key()命令來檢查幾個級別。

感謝您的幫助。

回答

1

我決定來解決has_key方法和使用的開始/救援/結束。

begin 
    @data.username = record['interaction']['author']['username'] 
rescue 
    @data.username = nil 
end 
0

這裏有一個可能性:

# where a and b are loaded from JSON 
a = { 
    'interaction' => { 
    'author' => { 
     'username' => 'johndoe', 
     'name' => 'jd' 
    } 
    } 
} 
b = { 
    'interaction' => { 
    'author' => { 
     'oijoijoij' => 'johndoe', 
     'name' => 'jd' 
    } 
    } 
} 
class Hash 
    def recursive_has_key?(key) 
    has_key?(key) or values.any? { |v| v.is_a?(Hash) and v.recursive_has_key?(key) } 
    end 
end 
puts a.recursive_has_key?('username') 
puts b.recursive_has_key?('username') 

,輸出

$ ruby foo.rb 
true 
false 
+0

好方法,雖然不能確定這將完全在一個密鑰被複制到某個地方並攜帶不同值的事件中工作。可以將函數構建到seed.rb文件中 - 所以我們很接近。 – matthewvb

+0

更新:我不知道如何將該方法構建到seed.rb文件中。我嘗試添加它作爲一種方法,它不喜歡它在文件中,並試圖調用它。有關我如何添加它的任何想法? – matthewvb