在JSON解码的哈希中搜索name的属性

时间:2013-05-13 11:52:51

标签: ruby-on-rails ruby json search hash

我有一个由一系列画廊组成的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 :(得分: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"}]