Leia_Organa
Leia_Organa

Reputation: 2094

How do I access this JSON API data in Ruby?

I am writing a short Ruby program that is going to take a zipcode and return the names of cities within 2 miles of that zipcode. I successfully called an API and was able to parse the JSON data, but I'm unsure how to access the 'city' key.

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

uri = URI(url)

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

Here's what my JSON looks like.

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

I've been trying to access 'city' like this:

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

This appears to be incorrect. Also tried

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

And a couple of other permutations of the same code.

How can I get the value 'Northfield' out of the JSON data?

Upvotes: 2

Views: 1036

Answers (3)

lacostenycoder
lacostenycoder

Reputation: 11226

JSON parse will create a hash then you can target the results which is an array of hashes, like so:

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

Or if you only care about the results:

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

To get just a single data point from the data, you might select one item in the array and then the key of the value you want:

array[0]['city']

For all the cities

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

Upvotes: 2

Rohit Lingayat
Rohit Lingayat

Reputation: 716

You have a typo error, instead of response['result'] you can use it like response[:results].

And if you want to get the value of city key from all the hash, then response['result'][0]['city'] will not work.

After parsing response you will get an array of hashes, i.e

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

And if you want to fetch the values of key city from all the hash then you can try this steps

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

which will give the result

["Atlantic", "Atlantic"]

Upvotes: 0

Gerry
Gerry

Reputation: 10507

You're almost there, just use results instead of result on the result of JSON.parse(response) instead of on response:

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

Upvotes: 6

Related Questions