2014-09-14 3 views
3

Моя классовая структура выглядит следующим образом -Невозможно декодировать JSON строку в объект питона с помощью jsonpickle

class HelloWorld (object): 
    def __init__(self, name, i, id): 
     self.name = name 
     self.i = i 
     self.id = id 

Я создаю объект

p = HelloWorld('pj', 3456, '1234') 

и передачи этого объекта в определении , где я использую jsonpickle.encode и jsonpickle.decode следующего

>>>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'> 

Я не понимаю, почему я неспособный декодировать его обратно к исходному объекту, несмотря на то, что также присутствует отличительный py/object.

Может кто-нибудь предложить, что я делаю неправильно?

Добавление кода, генерирующего динамический класс для вышеупомянутого прецедента.

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 
+0

Выполняете ли вы все это в интерактивной консоли или «HelloWorld» импортируется из файла? –

+0

Я пробовал это на python 2.7.7, и он работает нормально, используя код, который вы опубликовали. Вы можете проверить, с какой версией python вы работаете? возможно, это и есть причина. –

+0

Я не могу воспроизвести вашу проблему. –

ответ

2

Основная проблема здесь, класс не доступен во время декодирования, следовательно, не может декодировать его как объект Python.

Согласно документации JsonPickle (http://jsonpickle.github.io/#module-jsonpickle), объект должен быть доступен глобально через модуль и должен наследовать объект (классы нового класса AKA).

Следовательно, следуют следующему рецепту, http://code.activestate.com/recipes/82234-importing-a-dynamically-generated-module/. С его помощью вы можете генерировать динамический модуль и динамически загружать классы. Таким образом, при декодировании класс будет доступен, и, следовательно, вы можете декодировать его обратно на объект python.