Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/276.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python解码JSON_Python_Json_Encoding - Fatal编程技术网

用python解码JSON

用python解码JSON,python,json,encoding,Python,Json,Encoding,我有一个问题,似乎找不到解决办法。我有一个通过JSON与Java应用程序对话的应用程序。非常简单,但我遇到了一个问题,即如何使用嵌套对象从网上解码JSON。例如,我有: class obj1(object): def __init__(self, var1, var2): self.var1 = var1 self.var2 = var2 def __eq__(self, other): return (isinstance(othe

我有一个问题,似乎找不到解决办法。我有一个通过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->Custom对象中获取信息?(事实上,我有20个自定义对象嵌套在另一个对象中。对象->JSON工作得很好,只是向另一个方向发展。有什么想法吗?

你需要“链接”对象创建


obj2类(对象):
定义初始化(self,v1,v2,obj1):
self.v1=v1
self.v2=v2
如果类型(obj1)为dict:
self.obj1=obj1(**obj1)
其他:
self.obj1=obj1

我有一种稍微不同的使用继承的方法:

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

如果我的代码看起来很笨拙,很抱歉!如果有任何建议,请提供建议!

您是否尝试在def_uuueq_uuu(self,other)中添加调试输出?是的,基本上发生了什么myNewObj.obj1是一个属性字典,永远不会被实例化为具有正确参数的“obj1”对象。