如何自动提取嵌套json,其中很少有json对象嵌套json对象,但可以使用__dict__进行解析

时间:2019-03-22 13:48:44

标签: python json nested

对象如下所示


{
"id":1,
"image":"path/to/image",
"employee_data":<sql_alcahmy_object>,
}

再次sql_alcahmy_object如下

{
"employee_previous":<sql_alchemy_object2>,
"employee_salary":"1$",

}

再次sql_alcahmy_object2如下


{"company":"xyz","years":10}

以下方法将用于从sql炼金术对象中提取所有数据

sql_alchemy_object.__dict__

下面是计划的递归方法,但没有解决

def extract_recursive(deepvalue,alldata={}):
    for eachkey,eachvalue in deepvalue.__dict__.iteritems():
        if hasattr(eachvalue,"__dict__"):
            alldata.update({eachkey:extract_recursive(eachvalue)})
        else:   
            alldata.update({eachkey:eachvalue})
    print(alldata)

预期产量


{
"id":1,
"image":"path/to/image",
"employee_data":{
             "employee_previous":{"company":"xyz","years":10},
             "employee_salary":"1$",

              }
}

如下所示的deepvalue和sql_alcahmy_object中可用的方法

 ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__mapper__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__table__', '__tablename__', '__weakref__', '_decl_class_registry', '_sa_class_manager', 'age'] 

1 个答案:

答案 0 :(得分:0)

这里的__dict__有一个误解

实际上是

  

用于存储对象(可写)属性的字典或其他映射对象。

但是它不允许访问字典的嵌套字典。

因此,如果要遍历字典中的项目,只需调用thedict.iteritems()而不是thedict.__dict__.iteritems()

然后,如果要检查变量是否包含dict实例,请使用isinstance(a_dict, dict),而不要使用hasattr(a_dict, '__dict__')

此外,使用可变对象作为函数参数的默认值可能会产生非直觉的结果,因此强烈建议不要这样做(请参阅"Least Astonishment" and the Mutable Default Argument) 相反,您可能应该传递None作为默认值,并在函数开始时添加一个alldata = alldata or {}

最后,尽管我不了解您的功能要点,但是此版本应该更好地工作:

def extract_recursive(deepvalue, alldata=None):
    alldata = alldata or {}
    for eachkey, eachvalue in deepvalue.iteritems():
        if isinstance(eachvalue, dict):
            alldata.update({eachkey:extract_recursive(eachvalue)})
        else:
            alldata.update({eachkey:eachvalue})
    print(alldata)