簡體   English   中英

使用jsonpickle從文件中保存和加載對象

[英]saving and loading objects from file using jsonpickle

我有以下簡單的方法使用jsonpickle將python對象寫入文件:

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

問題是,無論何時我使用它們,它都會將我的對象作為字典(具有類似“py / object”:“my_module.MyClassName”)的字段加載回來,而不是用作生成的類型的實際Python對象json字符串。 我怎么能這樣做jsonpickle實際上將加載的字符串轉換回對象?

用一個例子來說明這一點,請考慮以下內容:

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

這會產生:

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

而不是像:[Foo()]。 我怎樣才能解決這個問題?

謝謝。

正確的答案是我沒有從object繼承。 在沒有繼承自object ,jsonpickle無法正確解碼構造函數中帶有一個或多個參數的類。 我絕不是專家但是把它變成Foo(object):而不是Foo:在類聲明中修復它。

確保json_load_file()中的use_jsonpickle == True 看來你使用jsonpickle序列化並使用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

確保對象類型可用

>>> 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'>

截至發布時,如果序列化對象是內部類,則存在導致編碼錯誤的錯誤。 確保該類不在另一個類中。 我向維護者提出了一個問題。 https://github.com/jsonpickle/jsonpickle/issues/210

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM