python - cpickle read
guardando y cargando objetos desde un archivo usando jsonpickle (3)
A partir de esta publicación, hay un error que hace que la codificación sea incorrecta si el objeto serializado es una clase interna. Asegúrese de que la clase no se encuentra dentro de otra clase. He presentado un problema con el mantenedor. https://github.com/jsonpickle/jsonpickle/issues/210
Tengo los siguientes métodos simples para escribir un objeto python en un archivo usando 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
el problema es que siempre que uso estos, vuelve a cargar mis objetos como diccionarios (que tienen campos como: "py / object": "my_module.MyClassName") pero no como un objeto Python real del tipo que se usó para generar el json cadena. ¿Cómo puedo hacer que jsonpickle convierta la cadena cargada al objeto?
Para ilustrar esto con un ejemplo, considere lo siguiente:
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
Esto produce:
list_objects: [{''py/object'': ''as_events.Foo'', ''hello'': ''hello world''}]
En lugar de algo como: [Foo ()]. ¿Cómo puedo arreglar esto?
Gracias.
Asegúrese de que use_jsonpickle == True
en json_load_file()
. Parece que usted serializa usando jsonpickle
y carga usando 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
Asegúrese de que el tipo de objeto está disponible
>>> 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''>
La respuesta correcta fue que no estaba heredando de un object
. Sin heredar de un object
, jsonpickle no puede decodificar correctamente las clases que toman uno o más argumentos en el constructor, parece. No soy de ninguna manera un experto, pero lo hago Foo(object):
lugar de Foo:
en la declaración de clase lo arreglé.