我正在编写一个简短的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数据?
答案 0 :(得分:5)
您几乎就在那里,只需使用results
而不是result
来JSON.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"]