我有一个由一系列画廊组成的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'))
我想获取一个包含文档中所有照片的数组。
这个文件的结构可能会发生变化,所以我想要一个搜索属性名称的答案,而不是它在哈希中的位置。
获取包含所有相册中所有照片的数组的最简单方法是什么?不依赖于文档中照片的位置?
答案 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"}]