使用Ruby on Rails从JSON url获取值

时间:2014-06-11 23:14:11

标签: ruby-on-rails ruby json hash get

我需要从Ruby on Rails哈希的哈希值获取GET值

@result = {
  "destination_addresses" => [
    "Matucana 775, Santiago Centro, Región  Metropolitana de Santiago de Chile, Chile"
  ],
  "origin_addresses" => [
    "San Pablo 6134, Lo Prado, Región Metropolitana de Santiago de Chile, Chile"
  ],
  "rows" => [
    {
      "elements" => [
        {
          "distance" => { 
            "text" => "10,0 km",
            "value" => 9957
          },
          "duration" => {
            "text" => "15 min",
            "value" => 903
          },
          "status"=>"OK"
         }
       ]
     }
   ],
 "status"=>"OK"
}

@duration = @result["rows"]["elements"]["distance"]["value"]
@distance = @result["rows"]["elements"]["duration"]["value"]

这导致:

ERROR:
can't convert String into Integer

1 个答案:

答案 0 :(得分:1)

问题是rowselements是数组,而不是您在查询中所期望的哈希。这个应该可以正常工作:

@duration = @result["rows"][0]["elements"][0]["duration"]["value"]
@distance = @result["rows"][0]["elements"][0]["distance"]["value"]

简而言之,对于每个puts操作,可以使用[]简单地调试此类问题。只需继续输出值到屏幕,直到出现任何错误,这将告诉您应该更仔细地探索散列的哪一部分。

puts "#{@result['rows']}"
puts "#{@result['rows'][0]}"
puts "#{@result['rows'][0]['elements']}"
# etc, till you get an error instead of the value

假设您正在使用Google Maps API,您可能最终会得到一些以不同格式返回数据的查询。有时您可以获得没有行的@result对象,也可以是没有elements的行条目。以下是处理此问题的方法:

get_value = lambda do |api_response, inner_key|
  result = api_response['rows']
  [0, 'elements', 0, inner_key, 'value'].each do |key|
    return nil unless result
    result = result[key]
  end
  result
end

@duration = get_value.call(@result, 'duration')
@distance = get_value.call(@result, 'distance')

如果您在此块结尾处的@duration@distance个变量中有nil,则可以确定Google Maps API无法正确解析您的查询。