【发布时间】:2011-01-24 18:43:26
【问题描述】:
我有以下使用 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()]。我该如何解决这个问题?
谢谢。
【问题讨论】:
-
你能在
jsonpickle.decode()行之前import as_events吗? -
FWIW 这是一个很好的例子,说明何时应该使用
with open()上下文管理器进行文件写入。当你在这里序列化时遇到错误,你会让你的文件保持打开状态——这很糟糕。
标签: python json serialization jsonpickle