python - How to make a class JSON serializable

ID : 1256

viewed : 167

Tags : pythonjsonserializationpython





Top 5 Answer for python - How to make a class JSON serializable

vote vote

100

Here is a simple solution for a simple feature:

.toJSON() Method

Instead of a JSON serializable class, implement a serializer method:

import json  class Object:     def toJSON(self):         return json.dumps(self, default=lambda o: o.__dict__,              sort_keys=True, indent=4) 

So you just call it to serialize:

me = Object() me.name = "Onur" me.age = 35 me.dog = Object() me.dog.name = "Apollo"  print(me.toJSON()) 

will output:

{     "age": 35,     "dog": {         "name": "Apollo"     },     "name": "Onur" } 
vote vote

83

Do you have an idea about the expected output? For example, will this do?

>>> f  = FileItem("/foo/bar") >>> magic(f) '{"fname": "/foo/bar"}' 

In that case you can merely call json.dumps(f.__dict__).

If you want more customized output then you will have to subclass JSONEncoder and implement your own custom serialization.

For a trivial example, see below.

>>> from json import JSONEncoder >>> class MyEncoder(JSONEncoder):         def default(self, o):             return o.__dict__      >>> MyEncoder().encode(f) '{"fname": "/foo/bar"}' 

Then you pass this class into the json.dumps() method as cls kwarg:

json.dumps(cls=MyEncoder) 

If you also want to decode then you'll have to supply a custom object_hook to the JSONDecoder class. For example:

>>> def from_json(json_object):         if 'fname' in json_object:             return FileItem(json_object['fname']) >>> f = JSONDecoder(object_hook = from_json).decode('{"fname": "/foo/bar"}') >>> f <__main__.FileItem object at 0x9337fac> >>>  
vote vote

80

For more complex classes you could consider the tool jsonpickle:

jsonpickle is a Python library for serialization and deserialization of complex Python objects to and from JSON.

The standard Python libraries for encoding Python into JSON, such as the stdlib’s json, simplejson, and demjson, can only handle Python primitives that have a direct JSON equivalent (e.g. dicts, lists, strings, ints, etc.). jsonpickle builds on top of these libraries and allows more complex data structures to be serialized to JSON. jsonpickle is highly configurable and extendable–allowing the user to choose the JSON backend and add additional backends.

(link to jsonpickle on PyPi)

vote vote

70

Most of the answers involve changing the call to json.dumps(), which is not always possible or desirable (it may happen inside a framework component for example).

If you want to be able to call json.dumps(obj) as is, then a simple solution is inheriting from dict:

class FileItem(dict):     def __init__(self, fname):         dict.__init__(self, fname=fname)  f = FileItem('tasks.txt') json.dumps(f)  #No need to change anything here 

This works if your class is just basic data representation, for trickier things you can always set keys explicitly.

vote vote

51

I like Onur's answer but would expand to include an optional toJSON() method for objects to serialize themselves:

def dumper(obj):     try:         return obj.toJSON()     except:         return obj.__dict__ print json.dumps(some_big_object, default=dumper, indent=2) 

Top 3 video Explaining python - How to make a class JSON serializable







Related QUESTION?