如何在Ruby中访问此JSON API数据?

时间:2018-04-14 05:28:37

标签: json ruby

我正在编写一个简短的Ruby程序,它将采用一个邮政编码并返回该邮政编码2英里范围内的城市名称。我成功调用了一个API并且能够解析JSON数据,但我不确定如何访问这个城市'键。

url = API call (not going to replicate here since it requires a key)

uri = URI(url)

response = Net::HTTP.get(uri)
JSON.parse(response)

这是我的JSON的样子。

{
  "results": [
    {
      "zip": "08225",
      "city": "Northfield",
      "county": "Atlantic",
      "state": "NJ",
      "distance": "0.0"
    },
    {
      "zip": "08221",
      "city": "Linwood",
      "county": "Atlantic",
      "state": "NJ",
      "distance": "1.8"
    }
  ]
}

我一直试图访问城市'像这样:

response['result'][0]['city']

这似乎不正确。也尝试了

response[0][0]['city'] 

以及其他几个相同代码的排列。

我怎样才能获得价值' Northfield'超出JSON数据?

3 个答案:

答案 0 :(得分:5)

您几乎就在那里,只需使用results而不是resultJSON.parse(response)而不是response

JSON.parse(response)["results"][0]["city"]
#=> "Northfield"

答案 1 :(得分:2)

JSON解析将创建一个哈希,然后你可以定位结果,这是一个哈希数组,如下所示:

hash = JSON.parse(response)
hash['results'].select{|h| h['city'] == 'Northfield'}

或者如果您只关心结果:

array = JSON.parse(response)['results']
array.select{|a| a['city' == 'Northfield'} #

要从数据中获取单个数据点,您可以在数组中选择一个项目,然后选择所需值的键:

array[0]['city']

适用于所有城市

cities = array.map{|k,v| k['city']}

答案 2 :(得分:0)

您有错字错误,而不是response['result'],您可以像response[:results]一样使用它。

如果您想从所有哈希中获取city密钥的值,那么response['result'][0]['city']将无效。

解析响应后,您将获得一系列哈希值,即

[{:zip=>"08225", :city=>"Northfield", :county=>"Atlantic", :state=>"NJ", :distance=>"0.0"}, {:zip=>"08221", :city=>"Linwood", :county=>"Atlantic", :state=>"NJ", :distance=>"1.8"}]

如果你想从所有哈希中获取密钥city的值,那么你可以尝试这个步骤

response[:results].map{|x| x[:city]}

将给出结果

["Atlantic", "Atlantic"]