我遇到了一个问题,我似乎无法找到解决方案。我有一个通过JSON与Java应用程序对话的应用程序。非常简单,但是我遇到了使用嵌套对象解开JSON的问题。例如,我有:
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 :(得分: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
答案 1 :(得分: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'}"
很抱歉,如果我的代码看起来很笨重!如果有任何建议,请咨询!