2016-06-29 51 views
0

我試圖從嵌套JSON使用密鑰獲取一個值。Ruby Json使用密鑰訪問嵌套元素

JSON結構如下:

enter image description here

如果我嘗試:

puts person_id["name"] 

它做工精細,但這時如果我試圖讓手機值:

person_id.phone[0].["value"] 

它不起作用。

我該如何正確訪問phone value?特別是當primary字段是true?我試過this但沒有成功。提前致謝。

+1

歡迎堆棧溢出。不要使用圖像來表示充當代碼輸入的數據。我們不能重複使用,必須輸入,這會立即關閉您的潛在幫助。此外,鏈接可能會破壞然後中斷,讓你的問題沒有意義。請閱讀「[問]」,包括鏈接的頁面和「[mcve]」。 –

+1

@錫人解釋了爲什麼你不應該發佈代碼的圖像。我低估了你的問題,因爲你看到了他的評論,卻選擇了忽略他的建議。即使你選擇了答案,你也應該按照他的建議去做,因爲很多SO成員將來可能會閱讀你的問題。另外,請刪除破折號併爲哈希指定一個變量(例如,'hash = {...}'),以便讀者既可以剪切,粘貼也可以引用該變量而不必定義它。我將刪除你編輯的downvote。 –

回答

3

與唯一的問題你代碼是當您應該使用散列鍵訪問器["phone"]時,您試圖使用點方法訪問器.phone

這是一個可以理解的錯誤。它會在Javascript中工作。

添加此功能實際上並不困難。 Ruby有OpenStruct類,它是一個類似哈希的對象,可以自動添加點方法訪問器。你只需要require ostruct,這是標準庫的一部分。

你可以告訴JSON.parse自動所有哈希值轉換爲OpenStructs(source):

object = JSON.parse(json, object_class: OpenStruct) 

或者你可以使用recursive-open-struct寶石:

RecursiveOpenStruct.new(nested_hash) 
3

從外觀看,person_id是一個散列,字符串鍵爲"name""email""phone"。鍵"phone"的值是一個數組,其中的每個元素都是帶有鍵"label""value""primary"的散列。在這種情況下,你想要的是這樣的:

phone_array = person_id["phone"] 
# => [ { "label" => "Work", ... }, ... ] 

first_phone = phone_array[0] 
# => { "label" => "Work", ... } 

first_phone_value = first_phone["value"] 
# => "+0109135008" 

當然,你正在尋找一種方式,一條線要做到這一點,它看起來像這樣:

person_id["phone"][0]["value"] 
# => "+0109135008" 
+0

謝謝喬丹。它真的有效。然後,我不需要做任何改變即可獲得活動手機,因爲當前手機將始終處於0級別。 再次感謝。 –