在我的 Rails 应用程序中,我发送了一个需要解码的复杂 JSON 字符串。这不是我知道的问题。
现在,在实现所有内容之前,我尝试访问一些示例 JSON 结构,看看是否可以获取所有变量。问题是名称可能是可变的。
{"configurations" : [
{ "drinks" : [
{"menus" : [
{ "hot" : [
{"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 4},
{"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 6}
] },
{ "cold" : [
{"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 4},
{"id":15,"unit":"0.33", "price":"1", "currency":"Euro", "position": 6}
] },
{ "terminals" : [ {"id" : 4}, {"id": 6}, {"id": 7} ] },
{ "keys" : { "debit" : "on", "credit": "off" } }
] }
] } ] }
好的,现在以下字段是可变的:“饮料”、“热”、“冷”。所有其他字段都将被称为相同的。
现在我想在解码后访问此 JSON 字符串中的每个变量。在实现之前,我尝试了一个简单的 JSON:
{"configuration" : [ { "drinks" : [ { "id":15, "unit":"0.33" } ] } ] }
在轨中解码后得到
{ "configuration" => [{"drinks" => [{"id" => 15, "unit" => "0.33" }]}]}
现在如何在不使用“drinks”一词的情况下访问例如id
和unit
。该解决方案还应该可扩展到上面的示例。
一些额外信息:在大型 JSON 中,我应该访问那里列出的所有项目(id),将它们保存到表中并返回新 id,然后将其插入到 JSON 中。 (解释为什么需要这样做将需要额外的页面或 4 ^^)。
最佳答案
我写这个是为了在哈希中进行深度搜索,但首先我担心你的 json 有问题,当你解析它时你会得到这个,你会注意到例如终端不显示所有键。代码仍然需要修改以返回数组或哈希本身。
hash = JSON.parse(string) #the string you published
=>
{"configurations"=>
[{"drinks"=>
[{"menus"=>
[{"hot"=>
[{"id"=>15,
"unit"=>"0.33",
"price"=>"1",
"currency"=>"Euro",
"position"=>4},
{"id"=>15,
"unit"=>"0.33",
"price"=>"1",
"currency"=>"Euro",
"position"=>6}]},
{"cold"=>
[{"id"=>15,
"unit"=>"0.33",
"price"=>"1",
"currency"=>"Euro",
"position"=>4},
{"id"=>15,
"unit"=>"0.33",
"price"=>"1",
"currency"=>"Euro",
"position"=>6}]},
{"terminals"=>{"id"=>7}},
{"keys"=>{"debit"=>"on", "credit"=>"off"}}]}]}]}
这里是代码
class Hash
def dseek(search_key = "", path = "")
self.each do|key, value|
if value.is_a?(Hash)
path += "#{key}."
value.dseek(search_key, path)
else
if value.is_a?(Array)
path += "#{key}."
value.each do |val|
val.dseek(search_key, path)
end
else
puts "#{path}#{key}:#{value}" if search_key === key || search_key === ""
end
end
end
end
end
hash.dseek
给出
configurations.drinks.menus.hot.id:15
configurations.drinks.menus.hot.unit:0.33
configurations.drinks.menus.hot.price:1
configurations.drinks.menus.hot.currency:Euro
configurations.drinks.menus.hot.position:4
configurations.drinks.menus.hot.id:15
configurations.drinks.menus.hot.unit:0.33
configurations.drinks.menus.hot.price:1
configurations.drinks.menus.hot.currency:Euro
configurations.drinks.menus.hot.position:6
configurations.drinks.menus.cold.id:15
configurations.drinks.menus.cold.unit:0.33
configurations.drinks.menus.cold.price:1
configurations.drinks.menus.cold.currency:Euro
configurations.drinks.menus.cold.position:4
configurations.drinks.menus.cold.id:15
configurations.drinks.menus.cold.unit:0.33
configurations.drinks.menus.cold.price:1
configurations.drinks.menus.cold.currency:Euro
configurations.drinks.menus.cold.position:6
configurations.drinks.menus.terminals.id:7
configurations.drinks.menus.keys.debit:on
configurations.drinks.menus.keys.credit:off
和
hash.dseek("id")
给出
configurations.drinks.menus.hot.id:15
configurations.drinks.menus.hot.id:15
configurations.drinks.menus.cold.id:15
configurations.drinks.menus.cold.id:15
configurations.drinks.menus.terminals.id:7
关于ruby - 访问哈希值和数组 Ruby,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10460504/