Вложенные JSON извлекают значения - PullRequest
0 голосов
/ 11 июня 2018

У меня есть вложенный объект JSON, имеющий следующую структуру.Я хотел бы получить все вложенные элементы уровня "concept" под основным уровнем "details".У меня проблемы с рекурсивным доступом к этим внутренним слоям json и получением его соответствующих значений ..

d = {"canonical": None, 
     "concept": "_MAIN", 
     "correct_string": "xxx", 
     "definition": "",
     "details": [{
                   "details": [{
                        "concept": "_A",
                            "details": [{
                                "concept": "_B",
                                    "details": [{
                                        "concept": "_C",
                                            "details": [{
                                                "concept": "_D", ....

Ожидаемый результат:

details_concepts = ['_A', '_B', 'C', 'D']

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Используя рекурсию, вы можете проверить базовый случай с помощью ключа concept и вернуть значения при прохождении базового условия следующим образом:

def get_data_by_key(data):
    if 'concept' in data:
        yield data['concept']
    details = data.get('details')
    if details:
        if isinstance(details, list):
            for inner_item in details:
                for i in get_data_by_key(inner_item):
                    yield i


data = {'canonical': None, 'concept': '_MAIN', 'correct_string': 'xxx', 'definition': '',
        'details': [{'concept': '_A', 'details': [{'concept': '_B', 'details': [{'concept': '_C'}]}]}]}
concepts = list(get_data_by_key(data['details'][0]))
print(concepts)

output : ['_A', '_B', '_C']
0 голосов
/ 11 июня 2018

Вы можете легко сделать это, используя Recursion, проверьте следующий код

d={"canonical": None,
     "concept": "_MAIN", 
     "correct_string": "xxx", 
     "definition": "",
     "details": [{
                   "details": [{
                        "concept": "_A",
                            "details": [{
                                "concept": "_B"
                    }]
                }]
        }]
  }
details_concepts=[]
def parse_json(det):
    if 'concept' in det[0]:
        details_concepts.append(det[0]['concept'])
    if 'details' in det[0]:
        return parse_json(det[0]['details'])
    else:
        return details_concepts
print(parse_json(d['details']))

Я считал, что в вашем внутреннем списке данных есть только один словарь, поэтому я сохранил det[0] напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...