[colug-432] deserialize objects in Ruby

Rick Hornsby richardjhornsby at gmail.com
Fri Sep 25 17:37:42 EDT 2015

Trying to do subclassing in Ruby, something I've done very little of generally.  I understand the basic premise "subclass _is a_ superclass", as in "dog is an animal", so class Dog < Animal etc.

Short version: I don't understand how to deserialize a subclass object and its parent (from JSON).

Long version:

I've got the serialization working, because it looks like the correct JSON data is being stored in my RedisDB.  I know my deserialization approach works because I've been using it prior to deciding that I wanted to re-work things into subclasses, when I only had one class.  Deserialization still works for the base class as well.

The basic idea is:

Song (base class)
    \_ AmazonSong
    \_ SpotifySong
    \_ YoutubeSong
    \_ etc

The subclasses are there primarily to provide type-specific support for the Song class.  i.e., the AmazonSong class understands how to resolve an Amazon URL into base class properties (title, album, etc), and has a few bits of data unique to the AmazonSong (amazon product ID, etc).

The serialization works via the implementation of to_json and self.json_create methods[1][2].  The key to the deserialization is after getting the JSON from the RedisDB, this call:

	request_data = JSON.parse(request_json, :create_additions => true)

Ruby uses the attribute in the JSON "json_class" to determine what type of object needs to be created.

I'm struggling to understand how to implement self.json_create in the subclass, so that Song also gets fully instantiated.  I think I need to call Song's json_create (super.json_create(?)) - but I'm not sure what to call or what arguments I need to pass it?  I'm honestly not 100% clear on exactly what is happening with the self.json_create methods - I only have a rough idea.


[1] https://gist.github.com/rjhornsby/72fb3b6057d0d747246d
[2] https://gist.github.com/rjhornsby/84d0e1481216808c18f7

More information about the colug-432 mailing list