saving and loading objects from file using jsonpickle

21,501

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'>
Share:
21,501
Admin
Author by

Admin

Updated on July 02, 2020

Comments

  • Admin
    Admin almost 4 years

    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(filename, 'w')
        if use_jsonpickle:
            import jsonpickle
            json_obj = jsonpickle.encode(obj)
            f.write(json_obj)
        else:
            simplejson.dump(obj, f) 
        f.close()
    
    def json_load_file(filename, use_jsonpickle=True):
        f = open(filename)
        if use_jsonpickle:
            import jsonpickle
            json_str = f.read()
            obj = jsonpickle.decode(json_str)
        else:
            obj = simplejson.load(f)
        return obj
    

    the problem is that whenever I use these, it loads my objects back as dictionaries (that have fields like: "py/object": "my_module.MyClassName") but not as an actual Python object of the type that was used to generate the json string. How can I make it so jsonpickle actually converts the loaded string back to the object?

    to illustrate this with an example, consider the following:

    class Foo:
        def __init__(self, hello):
        self.hello = hello
    
    # make a Foo obj
    obj = Foo("hello world")
    obj_str = jsonpickle.encode(obj)
    restored_obj = jsonpickle.decode(obj_str)
    list_objects = [restored_obj]
    # We now get a list with a dictionary, rather than
    # a list containing a Foo object
    print "list_objects: ", list_objects
    

    This yields:

    list_objects:  [{'py/object': 'as_events.Foo', 'hello': 'hello world'}]
    

    Rather than something like: [Foo()]. How can I fix this?

    thanks.

  • ed22
    ed22 over 7 years
    Can anyone tell me what is this "u" thing in {u'py/object': u'main.A', u'name': u'abc'} ?
  • jfs
    jfs over 7 years
    @ed22 it is how unicode string literals are written in Python 2. repr(unicode_string) uses the same text representation.
  • ed22
    ed22 over 7 years
    Thank you so much!