My class structure is as follows -
class HelloWorld (object):
def __init__(self, name, i, id):
self.name = name
self.i = i
self.id = id
The I'm creating an object
p = HelloWorld('pj', 3456, '1234')
and passing this object to a definition, where I use jsonpickle.encode
and jsonpickle.decode
as follows
>>>print(type(p))
<class 'HelloWorld'>
>>>x = jsonpickle.encode(p)
>>>print(x)
{"i": 3456, "name": "pj", "py/object": "__builtin__.HelloWorld", "id": "1234"}
>>>y = jsonpickle.decode(x)
>>>print(type(y))
<class 'dict'>
I don't understand why I'm not able to decode it back to the original object, even though the distinguishing py/object
is also present.
Can anyone please suggest what am I doing wrong?
Adding the code which generate's the dynamic class for above mentioned use case.
def _create_pojo(self, pojo_class_name, param_schema):
#extracting the properties from the parameter 'schema'
pojo_properties = param_schema['properties']
#creating a list of property keys
pojo_property_list = []
for key in pojo_properties:
pojo_property_list.append(key)
source = \
"class %s (object):\n" % ( pojo_class_name )
source += " def __init__(self, %s" % ', '.join(pojo_property_list) +"):\n" #defining __init__ for the class
for prop in pojo_property_list: #creating a variable in the __init__ method for each property in the property list
source += " self.%s = %s\n" % (prop, prop)
#generating the class code
class_code = compile( source, "<generated class>", "exec" )
fakeglobals = {}
eval( class_code, {"object" : object}, fakeglobals )
result = fakeglobals[ pojo_class_name ]
result ._source = source
pprint.pprint(source)
self._object_types[ pojo_class_name ] = result
return result
The main problem here is, the class is not available while decoding, hence unable to decode it as an python object.
According to the JsonPickle documentation( http://jsonpickle.github.io/#module-jsonpickle ), the object must be accessible globally via a module and must inherit from object (AKA new-style classes).
Hence followed following recipe, http://code.activestate.com/recipes/82234-importing-a-dynamically-generated-module/ . Using this you can generate dynamic module and load the classes dynamically. In this way while decoding the class will be accessible, and hence you can decode it back to python object.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.