首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jsonpickle从文件中保存和加载对象

使用jsonpickle从文件中保存和加载对象
EN

Stack Overflow用户
提问于 2010-03-08 05:39:12
回答 3查看 20.8K关注 0票数 21

我有以下简单的方法可以使用jsonpickle将python对象写入文件:

代码语言:javascript
复制
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”的字段)加载回来,而不是作为用于生成json字符串类型的实际Python对象。如何才能让jsonpickle真正将加载的字符串转换回对象?

要通过示例来说明这一点,请考虑以下内容:

代码语言:javascript
复制
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

这会产生以下结果:

代码语言:javascript
复制
list_objects:  [{'py/object': 'as_events.Foo', 'hello': 'hello world'}]

而不是像Foo()这样的东西。我该如何解决这个问题呢?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-09 08:27:24

正确的答案是我不是从object继承的。如果不继承object,jsonpickle似乎无法正确解码在构造函数中接受一个或多个参数的类。我绝对不是专家,但是在类声明中使用Foo(object):而不是Foo:可以解决这个问题。

票数 23
EN

Stack Overflow用户

发布于 2010-03-08 06:22:50

确保json_load_file()中的use_jsonpickle == True。似乎您使用jsonpickle进行序列化,并使用json进行加载。

代码语言:javascript
复制
>>> 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

确保该对象类型可用

代码语言:javascript
复制
>>> 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'>
票数 4
EN

Stack Overflow用户

发布于 2018-07-02 17:45:44

在这篇文章中,如果序列化的对象是一个内部类,就会有一个bug导致编码错误。确保类不在另一个类中。我已经向维护人员提交了一个问题。https://github.com/jsonpickle/jsonpickle/issues/210

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2398078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档