simplejson.dumps(dict) throws "not JSON serializable"

Giovanni Bitliner picture Giovanni Bitliner · Jan 22, 2012 · Viewed 9.3k times · Source

I have a Python dictionary where the keys are strings, and values are list of MyObject objects. If I execute

simplejson.dumps(dict)

it throws "MyObject not JSON serializable".

How can I avoid this exception, and how can I make MyObject serializable?

Answer

Patrick Perini picture Patrick Perini · Jan 25, 2012

Proper Answer

In order to make your MyObject serializable, you need to implement a method that you can reference on dumps. For example:

class MyObject:
    #    ...
    #    MyObject has 3 properties: name (a string), number (an int), and parent (a MyObject)
    @staticmethod
    def serialize(obj):
        return {
            "name":   obj.name,
            "number": obj.number,
            "parent": obj.parent
        }

    #    ...

simplejson.dumps(myObjInstance, default=MyObject.serialize)

The cool thing is that dumps will, like every other JSON-serializable object, call the serialization method recursively. That is, obj.parent will get serialized as well, without any further action from you.

Golf'd Version

If all you want to do is 1-1 map instance variable names to their respective values, you can use some built-in Python magic. Whenever you want to serialize a more complex object (again, only using a 1-1 variable-value map), just call this line:

simplejson.dumps(anyObj, default=lambda obj: obj.__dict__)

For the given instance of MyObject, it will behave identically to the aforementioned serialize method.