Как автоматически извлечь вложенный json, в котором несколько json-объектов вложены в json-объект, но могут быть проанализированы с помощью __dict__ - PullRequest
0 голосов
/ 22 марта 2019

объект выглядит как ниже


{
"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 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_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 голосов
/ 22 марта 2019

Существует неправильное понимание того, что __dict__ здесь

Это на самом деле

Словарь или другой объект сопоставления, используемый для хранения объекта (доступный для записи) атрибутов.

, но он не позволяет получить доступ к вложенным диктовкам диктов.

Итак, если вы хотите перебирать элементы в диктовке, вам просто нужно вызватьthedict.iteritems() not thedict.__dict__.iteritems().

Затем, если вы хотите проверить, содержит ли переменная экземпляр dict, используйте isinstance(a_dict, dict), а не hasattr(a_dict, '__dict__').

Дополнительно, используяИзменяемый объект в качестве значения по умолчанию для аргумента функции может привести к неинтуитивному результату, поэтому настоятельно не рекомендуется (см. «Наименьшее изумление» и Аргумент изменяемого по умолчанию ). Вместо этого вам, вероятно, следует передать 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...