[Python-ideas] Serialization of custom classes.
Jakob Bowyer
jkbbwr at gmail.com
Wed Mar 30 12:42:53 CEST 2011
"""
Currently json dumping an object is sketchy because of the need to serialise.
E.g.
"""
import json
class Something(object):
def __init__(self, arg1):
self.arg1 = arg1
def __str__(self):
return str(self.arg1)
def __repr__(self):
return str(self.arg1)
def double(self):
return self.arg1 * 2
test = Something(42)
#json.dumps(test)
"""This ofc raises a TypeError as shown here
------------------------------------------------------------
Traceback (most recent call last):
File "<ipython console>", line 1, in <module>
File "C:\Python26\Lib\site-packages\spyderlib\widgets\externalshell\startup.py",
line 122, in runfile
execfile(filename, glbs)
File "C:\infobarb\test.py", line 22, in <module>
json.dumps(test)
File "C:\Python26\lib\json\__init__.py", line 230, in dumps
return _default_encoder.encode(obj)
File "C:\Python26\lib\json\encoder.py", line 367, in encode
chunks = list(self.iterencode(o))
File "C:\Python26\lib\json\encoder.py", line 317, in _iterencode
for chunk in self._iterencode_default(o, markers):
File "C:\Python26\lib\json\encoder.py", line 323, in _iterencode_default
newobj = self.default(o)
File "C:\Python26\lib\json\encoder.py", line 344, in default
raise TypeError(repr(o) + " is not JSON serializable")
TypeError: 42 is not JSON serializable
My suggested fix and an idea used by several others could be to add a __json__
method to objects, this method would be tried by json.dumps() before it tries to
serialise the argument. It should return all of the instance variables in a json
format and any other infomation considered to be correct for the dump.
This could be extended to provide a __json__ and a __jsons__ format where the
latter returns a string format of the __json__ serialzation an example of which
(crudely constructed ofc) is below. But for now I consider __json__ to return a
string serialized for json dumping.
"""
import json
def customjsondumps(obj):
try:
return json.dumps(obj.__json__())
except AttributeError:
raise AttributeError('Object has no __json__ method.')
"""There are ofc several ideas for the __json__ method e.g."""
def __json__(self):
"""This method returns a serialized string for json.dumps"""
return self.__dict__
"""Or returning some fancy constructed dict, list or other serialised form for
dumping into json."""
class Something(object):
def __init__(self, arg1):
self.arg1 = arg1
def __str__(self):
return str(self.arg1)
def __repr__(self):
return str(self.arg1)
def double(self):
return self.arg1 * 2
def __json__(self):
ret = self.__dict__.copy()
for key, item in ret.iteritems():
ret[key] = item.__repr__()
return ret
test = Something(41)
More information about the Python-ideas
mailing list