2013-05-13 5 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

Каков ваш ожидаемый результат? –

+0

@Priti Отредактированный вопрос, чтобы сделать его более понятным. Я хочу, чтобы все фотографии в документе находились в массиве. – Undistraction

+0

'Мне нужен ответ, который ищет имя атрибута, а не его расположение внутри хеша.' Означает? нужна четкая информация об этом. –

ответ

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"}] 
Смежные вопросы