2013-03-10 3 views
0

У меня есть эта проблема, где я продолжаю получатьПеребор Hash (массив)

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++ с именем [integer], но я хотел бы использовать ["name"]. Как я могу заставить свой код работать?

Спасибо за ваше драгоценное время и внимание.

+1

Это один, если те времена, я считаю, имея необработанный XML предпочтительнее иметь результат анализа XML в хеш. Итерационные узлы намного чище. Кроме того, не используйте представление для работы контроллеров. Разбирайте информацию в чистую структуру и передайте данные в представление. –

+0

Спасибо, мужчина, да, я думаю о том, что не разбираю xml от httpparty и не делаю это для себя. Кажется, мне не придется проходить через эти многочисленные проблемы. – 2013-03-10 17:10:28

+0

@theTinMan: Ваш комментарий должен быть ответом :-) –

ответ

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 

Спасибо за ваше время и внимание.

0

Оловянный человек имеет хорошую точку зрения о сохранении этой логики вне представления и должен быть работой модели. Вот более чистый взгляд.

<% @data['body']['predictions']['direction']['prediction'].each do |x| %> 
    <% x.each do |k, v| %> 
    <h4><%= v %></h4> 
    <% end %> 
<% end %> 
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++ programmmer, вы могли бы это: P

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" 
    ] 
] 
Смежные вопросы