0

ギャラリーの配列で構成される 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'))

ドキュメント内のすべての写真を含む配列を取得したいと思います。

このファイルの構造が変更される可能性があるため、ハッシュ内の場所ではなく、属性名で検索する回答が必要です。

ドキュメント内の写真の場所に依存しない、すべてのギャラリーのすべての写真を含む配列を取得する最も簡単な方法は何ですか?

4

1 に答える 1

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"}]
于 2013-05-13T13:05:40.703 に答える