我有这个问题,我继续
TypeError: can't convert String into Integer
这是我要浏览这个@data对象的地方。
这是@data对象
@data = HTTParty.get("")
{
"body"=>{
"predictions"=>{
"direction"=>{
"prediction"=>[
{
"epochTime"=>"1362931090892",
},
{
"epochTime"=>"1362931747892",
},
{
"epochTime"=>"1362932467892",
},
{
"epochTime"=>"1362933187892",
},
{
"epochTime"=>"1362933847892",
}
],
"title"=>"xxxx"
},
"a"=>"xx",
"b"=>"x"
},
"name"=>"some"
}
}
我上面的代码已经
了 <% if @data["body"]["predictions"].present? %>
<% @data["body"]["predictions"].each do |p| %>
<%p["direction"].each do |d|%>
<% d["prediction"].each do |k|%>
<h4><%= k["epchoTime.."] %> </h4>
<%end%>
<%end%>
<%end%>
<%end%>
我不知道如何解决这个问题,我认为这是因为我应该像使用名称[整数]值一样访问C ++中的内容,但我想使用[“name”]。如何让我的代码工作?
感谢您宝贵的时间和考虑。
答案 0 :(得分:1)
以下是使用Nokogiri解析原始XML的示例:
require 'nokogiri'
doc = Nokogiri::XML(<<EOT)
<body>
<predictions>
<direction>
<prediction>
<epochTime>1362931090892</epochTime>
<epochTime>1362931747892</epochTime>
<epochTime>1362932467892</epochTime>
<epochTime>1362933187892</epochTime>
<epochTime>1362933847892</epochTime>
</prediction>
<title">xxxx</title>
<a>"xx"</a>
<b>"x"</b>
<name>"some"</name>
</direction>
</predictions>
</body>
EOT
epoch_times = doc.search('epochTime').map(&:text)
返回epochTime
值数组:
[
[0] "1362931090892",
[1] "1362931747892",
[2] "1362932467892",
[3] "1362933187892",
[4] "1362933847892"
]
有时我们需要遍历包含prediction
块的所有epochTime
块。这样就可以了:
epoch_times = doc.search('prediction').map{ |predict|
predict.search('epochTime').map(&:text)
}
[
[0] [
[0] "1362931090892",
[1] "1362931747892",
[2] "1362932467892",
[3] "1362933187892",
[4] "1362933847892"
]
]
有时你需要找到一个特定的节点并抓住其中某种类型的所有元素:
doc = Nokogiri::XML(<<EOT)
<body>
<predictions>
<direction>
<prediction id="1">
<epochTime>1362931090892</epochTime>
<epochTime>1362931747892</epochTime>
<epochTime>1362932467892</epochTime>
<epochTime>1362933187892</epochTime>
<epochTime>1362933847892</epochTime>
</prediction>
<title">xxxx</title>
<a>"xx"</a>
<b>"x"</b>
<name>"some"</name>
</direction>
</predictions>
</body>
EOT
epoch_times = doc.search('prediction[id="1"]').map{ |predict| predict.search('epochTime').map(&:text) }
[
[0] [
[0] "1362931090892",
[1] "1362931747892",
[2] "1362932467892",
[3] "1362933187892",
[4] "1362933847892"
]
]
答案 1 :(得分:0)
Tin Man有一个很好的观点,即将这种逻辑置于观点之外,应该是一个模型的作品。这是一个更清晰的观点。
<% @data['body']['predictions']['direction']['prediction'].each do |x| %>
<% x.each do |k, v| %>
<h4><%= v %></h4>
<% end %>
<% end %>
答案 2 :(得分:0)
您似乎忽略了没有嵌套值的密钥,例如title
和a
,b
。
"title"=>"xxxx"
},
"a"=>"xx",
"b"=>"x"
},
您的最终代码应该是
if @data["body"]["predictions"].present?
@data["body"]["predictions"].each do |p|
p.each do |d|
if d.kind_of? Hash
d.each do |k|
if k.kind_of? Array
k.each do |x|
if x.kind_of? Array
x.each do |y|
if y.kind_of? Hash
puts y["epochTime"]
end
end
end
end
end
end
end
end
end
end
上面的代码很丑,但你是C ++程序员,你可能会喜欢它:P
答案 3 :(得分:0)
整个哈希事情已经失控,因为我经常检测每个人的存在并循环通过它,所以正如锡人所说,我使用XML'nokogiri'然后使用.css方法来检测它是否存在和循环通过它,因为原始响应是在xml中。
@doc.css('predictions').each do |predictions_node|
predictions_node.css('direction').each do |direction_node|
direction_node.css('prediction').each do |prediction|
// stuff here
感谢您的时间和考虑。