read cpickle python json serialization jsonpickle

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é.