2015-11-11 5 views
1

У меня проблема, я не могу найти решение. У меня есть приложение, которое говорит с Java-приложением через JSON. Довольно просто, но у меня проблема с расшифровкой JSON с провода с вложенными объектами. Например, у меня есть:decode JSON in python

class obj1(object): 
    def __init__(self, var1, var2): 
     self.var1 = var1 
     self.var2 = var2 

    def __eq__(self, other): 
     return (isinstance(other, obj1) and 
     self.var1 == obj1.var1 and 
     self.var2 == obj2.var2) 

class obj2(object): 
    def __init__(self, v1, v2, obj1): 
     self.v1 = v1 
     self.v2 = v2 
     self.obj1 = obj1 

, и я хочу, чтобы сериализации и десериализации класс «obj2», я могу создать его довольно легко:

myObj1 = obj1(1,2) 
myObj2 = obj2(3.14, 10.05, myObj1) 

, когда я хочу, чтобы отправить его JSon, это очевидно, довольно легко:

import json 

def obj_to_dict(obj): 
    return obj.__dict__ 

my_json = json.dumps(myObj2, default=obj_to_dict) 

это создает идеальный JSON, как я бы ожидать:

{"obj1": {"var1": 1, "var2": 2}, "v1": 3.14, "v2": 10.05} 

проблема, с которой я столкнулась, заключается в кодировке этой строки обратно в два объекта. Я не могу добавить дополнительную информацию о типе, потому что приложение, которое отправляет эту схему обратно, отправляет ее именно таким образом. поэтому, когда я пытаюсь и восстановить его из словаря:

obj_dict = json.loads(my_json) 
myNewObj = obj2(**obj_dict) 

это не совсем работает

print myNewObj.obj1 == obj1 #returns False. 

Есть ли лучший способ получить из JSON -> Пользовательские объекты? (На самом деле у меня есть как 20 пользовательских объектов, вложенных в другой объект Объект -.> JSON отлично работает, его просто идти в другую сторону Любые мысли

+0

Вы пробовали добавить вывод отладки в def __eq __ (self, other):? –

+0

Да, в основном, что происходит myNewObj.obj1 - это словарь атрибутов и никогда не создается в объект «obj1» с правильными параметрами. – user1772250

ответ

2

Вам нужно для создания объекта «цепочки»

.?. class obj2(object): def __init__(self, v1, v2, obj1): self.v1 = v1 self.v2 = v2 if type(obj1) is dict: self.obj1 = obj1(**obj1) else: self.obj1 = obj1

+0

ах это прекрасно работает, gracias! – user1772250

0

у меня есть несколько иной подход, который использует наследование:

class json_dict(object): 
    def __init__(self, **kargs): 
     self.dict = { k:kargs[k] for k in kargs.keys() } 

    @property 
    def json(self): 
     d = self.dict 
     return str({k:(d[k].dict if isinstance(d[k], json_dict) else d[k]) for k in d.keys()}) 


class obj1(json_dict): 
    def __init__(self, var1, var2): 
     super(obj1, self).__init__(var1=var1, var2=var2) # dict at obj1 level 

    def __eq__(self, other): 
     return (isinstance(other, json_dict)) and (self.dict == other.dict) 

class obj2(json_dict): 
    def __init__(self, v1, v2, **kobjs): 
     super(obj2, self).__init__(v1=v1, v2=v2) # dict at obj2 level 

     for k, obj in kobjs.iteritems(): 
      if isinstance(obj, json_dict): 
       self.dict[k] = obj # append as many objects as you need 

При таком подходе, вы можете инициализировать obj1 и obj2 как следующие:

myobj1 = obj1("obj1 variable 1","obj1 variable 2") 
myobj2 = obj2("obj2 variable 1","obj2 variable 2", obj1=myobj1) 

appendedmore = obj2("obj2 variable 1","obj2 variable 2", obj1=o1, obj2=o2, obj3=o3) # o1,o2,o3 must inherit from json_dict 

# get json string from the objects 
myobj1.json # "{'var1': 'obj1 variable 1', 'var2': 'obj1 variable 2'}" 
myobj2.json # "{'obj1': {'var1': 'obj1 variable 1', 'var2': 'obj1 variable 2'}, 'v1': 'obj2 variable 1', 'v2': 'obj2 variable 2'}" 

Извините, если мой код выглядит неуклюжим! Пожалуйста, совет, если есть предложения!