如何自动提取嵌套的json,其中很少有json对象嵌套json对象,但可以用dict解析__

2024-09-22 16:33:21 发布

您现在位置:Python中文网/ 问答频道 /正文

对象如下所示


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

同样,sql\u alcahmy\u对象如下

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

}

同样,sql\u alcahmy\u object2如下所示


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

下面的方法将用于从sql alchemy对象中提取所有数据

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\u alcahmy\u对象中可用的方法如下

 ['__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'] 


Tags: path对象方法imageidsqlemployeedict
1条回答
网友
1楼 · 发布于 2024-09-22 16:33:21

对这里的^{}有一个误解

实际上是的

A dictionary or other mapping object used to store an object’s (writable) attributes.

但它不允许访问dict的嵌套dict

因此,如果您想在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)

相关问题 更多 >