saving and loading objects from file using jsonpickle

后端 未结 3 2037
迷失自我
迷失自我 2021-02-02 12:14

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(         


        
相关标签:
3条回答
  • 2021-02-02 12:28

    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

    0 讨论(0)
  • 2021-02-02 12:33

    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.

    0 讨论(0)
  • 2021-02-02 12:35

    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'>
    
    0 讨论(0)
提交回复
热议问题