I have the following simple methods for writing a python object to a file using jsonpickle:
def json_serialize(obj, filename, use_jsonpickle=True):
f = open(
As of this posting, there is a bug which causes encoding to be wrong if the serialized object is an inner class. Make sure the class is not located within another class. I've filed an issue with the maintainer. https://github.com/jsonpickle/jsonpickle/issues/210
The correct answer was that I was not inheriting from object
. Without inheriting from object
, jsonpickle cannot correctly decode classes that take one or more arguments in the constructor, it seems. I am by no means an expert but making it Foo(object):
rather than Foo:
in the class declaration fixed it.
Make sure that use_jsonpickle == True
in json_load_file()
. It seems that you serialize using jsonpickle
and load using json
.
>>> import jsonpickle
>>> class A(object):
... def __init__(self, name):
... self.name = name
...
>>> js = jsonpickle.encode(A('abc'))
>>> js
'{"py/object": "__main__.A", "name": "abc"}' # <-- json string
>>> a = jsonpickle.decode(js)
>>> a
<__main__.A object at 0x7f826a87bd90> # <-- python object
>>> a.name
u'abc'
>>> import json
>>> b = json.loads(js)
>>> b
{u'py/object': u'__main__.A', u'name': u'abc'} # <-- dictionary
Make sure that object type is available
>>> del A
>>> c = jsonpickle.decode(js) # no type available
>>> c
{u'py/object': u'__main__.A', u'name': u'abc'}
>>> type(c)
<type 'dict'>
>>> class A(object):
... def __init__(self, name):
... self.name = name
...
>>> d = jsonpickle.decode(js) # type is available
>>> d
<__main__.A object at 0x7f826a87bdd0>
>>> type(d)
<class '__main__.A'>