2013-05-13 21 views
0

我具有由畫廊陣列的JSON文件,其每一個都有其自己的照片數組:搜索以JSON名稱的屬性被譯碼散列

[ 
    { 
    "title":"Some Title", 
    "photographs":[ 
     { 
     "title": "Boat Ramp" 
     }, 
     { 
     "title": "Security Camera" 
     }, 
     { 
     "title": "Exhaust Vents" 
     }, 
     { 
     "title": "Factory 1" 
     }, 
     { 
     "title": "Factory 2" 
     }, 
     { 
     "title": "Exhaust Vents" 
     }, 
     { 
     "title": "Viaduct" 
     }, 
     { 
     "title": "Girders" 
     }, 
     { 
     "title": "Office" 
     } 
    ] 
    } 
] 

我使用它進行解碼,以哈希:

galleries = ActiveSupport::JSON.decode(File.read('db/seed/galleries.json')) 

我想弄個包含文檔中所有照片的數組。

有可能這個文件的結構可能會改變,所以我想要一個在屬性名稱上搜索的答案,而不是它在哈希中的位置。

獲得包含所有畫廊中所有照片的數組的最簡單方法,不依賴於文檔內照片的位置?

+1

您的預期輸出是什麼? – 2013-05-13 12:07:26

+0

@Priti編輯這個問題,使其更清晰。我想要一個數組中的文檔中的所有照片。 – Undistraction 2013-05-13 12:10:08

+0

'我想要一個在屬性名稱上搜索的答案,而不是它在哈希中的位置。「意思是?需要明確的信息。 – 2013-05-13 12:12:04

回答

1

您需要編寫自己的方法遞歸搜索解碼的JSON結構以獲取鍵值。該方法需要決定如何在json樹的每個級別處理數組,哈希或字符串。可能是這樣的,這會對您的數據做出一些假設:

module KeyFinder 
    def find_by_key(object, key) 
    case object 
    when Array 
     object.each do |v| 
     result = find_by_key(v, key) 
     return result unless result.nil? 
     end 
    when Hash 
     object.each do |k, v| 
     if k == key 
      return v 
     else 
      result = find_by_key(v, key) 
      return result unless result.nil? 
     end 
     end 
    else # String 
     nil 
    end 
    end 
end 

include KeyFinder 

find_by_key(galleries, "photographs") 
# => [{"title"=>"Boat Ramp"}, {"title"=>"Security Camera"}, {"title"=>"Exhaust Vents"}, {"title"=>"Factory 1"}, {"title"=>"Factory 2"}, {"title"=>"Exhaust Vents"}, {"title"=>"Viaduct"}, {"title"=>"Girders"}, {"title"=>"Office"}]