Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Ruby getting deeply nested JSON API data

I have a rails app which gets a response from World Weather Online API. I'm using the rest-client gem and the response is in JSON format.

I parse the response using:

parsed_response = JSON.parse(response)

Where parsed_response is obviously a hash.

The data I need are strings inside a hash inside an array inside a hash inside another array inside another hash inside another hash.

The inner-most nested hashes are inside ["hourly"], an array of 8 hashes, each with 20 keys, possessing string values of various weather parameters. Each of these hashes in the array is a different time of day (the forecast is three-hourly, 3*8 = 24hours).

So, for example, if I want the swell height in metres at 9pm, I find it with the following call:

@swell_height = parsed_data["data"]["weather"][0]["hourly"][7]["swellHeight_m"]

Where the 7th element in the array correspond to "time" => "2100"

While I can definitely work with this, I'm curious as to whether there is a more straightforward method of accessing my data, like if it was a database table, I could use active record, something like:

@swell_height = parsed_data.swellHeight_m.where(:time => "2100")
like image 559
user1642579 Avatar asked Sep 25 '12 00:09

user1642579


1 Answers

You may want to look at JSONPath. It does exactly what you need. Its syntax is very similar to XPath, but JSONPath works with JSON data (as obvious).

There is a Ruby implementation: https://github.com/joshbuddy/jsonpath

I personally use it in every project where I need to test JSON responses.

like image 175
Daniel Vartanov Avatar answered Oct 19 '22 18:10

Daniel Vartanov