Ruby on rails Rails根据深度哈希数组中的键显示值
这是作为解析的_响应从API响应(XML)接收的哈希数组,使用Httparty 在内部遍历并获取值既困难又混乱Ruby on rails Rails根据深度哈希数组中的键显示值,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 4,这是作为解析的_响应从API响应(XML)接收的哈希数组,使用Httparty 在内部遍历并获取值既困难又混乱 "flights"=>{ "flight"=>{ "segments"=>{ "segment"=>[ (this has square brackets) { "index"=>"3", "d
"flights"=>{
"flight"=>{
"segments"=>{
"segment"=>[ (this has square brackets)
{
"index"=>"3",
"departure_airport"=>"DEL",
"arrival_airport"=>"CCU",
"departure_date_time"=>"2014-07-07T13:20:00",
"arrival_date_time"=>"2014-07-07T15:35:00",
"flight_number"=>"20",
"airline"=>"AI",
"operating_airline"=>"AI",
"stops"=>"0",
"equipment"=>"320",
"duration"=>"8100"
},
{
"index"=>"4",
"departure_airport"=>"CCU",
"arrival_airport"=>"BLR",
"departure_date_time"=>"2014-07-07T18:10:00",
"arrival_date_time"=>"2014-07-07T20:40:00",
"flight_number"=>"771",
"airline"=>"AI",
"operating_airline"=>"AI",
"stops"=>"0",
"equipment"=>"319",
"duration"=>"9000"
}
]
}
}
},
要显示上面的散列值,我做了
<% h["flights"]["flight"]["segments"]["segment"].each do |o,p| %>
<% if o.class == Hash %>
<strong><%= o['airline'] %></strong>
<%= o['arrival_airport'] %> - <%= o['arrival_date_time'] %><br>
<% else %>
<%= o %>
<% end %>
<% end %>
所以有了其他的承诺后,就会给
["index", "7"] ["departure_airport", "DEL"] ["arrival_airport", "BLR"] ["departure_date_time", "2014-07-10T07:10:00"] ["arrival_date_time", "2014-07-10T09:50:00"] ["flight_number", "807"] ["airline", "9W"] ["operating_airline", "9W"] ["stops", "0"] ["equipment", "738"] ["duration", "9600"]
但是用
代替else语句将给出与键关联的值
要使用键获取单个值,这很好。但将所有这些键放在上面的格式中以获取它们的值确实会变得很混乱
应该有更好的方法来解析它,但我不知道如何根据['segment']是否再次是散列或仅仅是一个键来推断出一个用例,在这个用例中,['segment'会给出适当的结果
谢谢
[h["flights"]["flight"]["segments"]["segment"]].flatten.each do |segment|
puts "#{segment['arrival_airport']} - #{segment['arrival_date_time']}"
end
HTH这里的解决方案是在循环之前将
散列
包装到数组中
控制器
@segments_array = Array.wrap(h["flights"]["flight"]["segments"]["segment"])
查看
<% @segments_array.each do |segment| %>
<strong><%= segment['airline'] %></strong>
<%= segment['arrival_airport'] %> - <%= segment['arrival_date_time'] %><br>
...
<% end %>
-
...
没有。这没有帮助。我只得到在段后是方括号的结果。搞砸上面解析的_响应的第一个块。不适用于解析的_响应的第二个块。它只显示原始键和值。某些副本的可能副本,同一海报。@dax不,它不是可能的副本。那是我问的。我只是无法穿过里面。这是一个更新,我必须放置一些尴尬的声明。我想改进一下。我的答案有效吗?你应该修改你现在的问题,而不是提出新的问题。这是你第三次问基本相同的问题,每个问题都得到了很好的回答。这是在else语句之后的
的结果<代码>[“索引”,“7”][“出发机场”,“DEL”][“到达机场”,“BLR”][“出发日期时间”,“2014-07-10T07:10:00”][“到达日期时间”,“2014-07-10T09:50:00”][“航班号”,“807”][“航空公司”,“9W”][“运营航空公司”,“9W”][“停靠站”,“0”][“设备”,“738”][“持续时间”,“9600”]
我最初得到的东西没有变化。我想知道,如果呈现一个指定:集合的部分,是否可以处理单个项与数组的比较,从而无需使用if
语句。感谢您的评论,我找到了将单个哈希
包装到数组中的方法,所以现在更干了:)我不得不再说一遍。这就行了。谢谢。
<% @segments_array.each do |segment| %>
<strong><%= segment['airline'] %></strong>
<%= segment['arrival_airport'] %> - <%= segment['arrival_date_time'] %><br>
...
<% end %>