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 回答