Deserializing JSON from API responses, files and the like is a pretty common task. Depending on the complexity of the JSON structure, this can be a bit difficult to work with though, since the default action of JSON.parse is to deserialize to a string-key Hash. This means that after parsing the JSON, there’s a lot of fetching, diging, and the like to get things working, and the code doesn’t usually come out super readable.

An alternative to this is based on an argument that I stumbled across this afternoon - object_class. This option defaults to Hash, but can be set to anything you like. The best example of this is what happens when object_class is set to OpenStruct:

require 'open-uri'
require 'openstruct'
require 'json'

me = JSON.parse(open("").read, object_class: OpenStruct)

=> "joshmcarthur"
=> "Josh McArthur"

It even works with nested objects!

repo_uri = ""

repo = JSON.parse(open(repo_uri).read, object_class: OpenStruct)

=> "joshmcarthur"

=> "joshmcarthur/"

While the examples above are using OpenStruct, it works equally well with a class of your own creation - the only requirement is that your initialize method accepts a Hash structure.