Используйте Python для извлечения содержимого с одним и тем же полем в JSON независимо от иерархии

#python #json #parsing

Вопрос:

вот демонстрационная версия моего текущего файла json:

 school=
[
{'grade':6,
'students':
[
{'id': 300515,
 'name': 'George',
 'height': 1.75},
{'id': 300516,
 'name': 'Lucy',
 'height': 1.65}]},
{'grade':5,
'students':
[
{'id': 300517,
 'name': 'Edward',
 'height': 1.80},
{'id': 300518,
 'name': 'Olivia',
 'height': 1.70}]}
]
 

Чего я хочу добиться, так это объединить все имена учащихся в одну строку, независимо от того, к какому классу они принадлежат (например, «Джордж Люси Эдвард Оливия»).

Однако иерархия реальных данных намного сложнее, чем в этой демонстрации, что означает, что здесь на верхнем уровне еще больше слоев school (возможно, вы можете себе представить, например, район, город, штат и т. Д. В этой демонстрации). В настоящее время я могу использовать только несколько for циклов для достижения этой цели.

Но я хочу знать, есть ли какие-либо короткие пути для достижения этой цели. Например, используйте одну функцию для извлечения всего содержимого в json, если они принадлежат одному полю и независимо от иерархии. Спасибо.

Комментарии:

1. да, вы можете сделать это с помощью рекурсии.

Ответ №1:

Вы можете использовать рекурсию таким образом.

 
school=[
    {'grade':6,'students':[{'id': 300515, 'name': 'George', 'height': 1.75},
    {'id': 300516, 'name': 'Lucy', 'height': 1.65}]},
    {'grade':5,'students':[{'id': 300517, 'name': 'Edward', 'height': 1.80},
    {'id': 300518, 'name': 'Olivia','height': 1.70}]}
]


def getNames(json,names):
  if isinstance(json,dict):
    for key,value in json.items():
      if 'name' is key:
        names.append(value)
      if isinstance(value,list):
        for line in value:
          if isinstance(line,dict):
            getNames(line,names)
  elif isinstance(json,list):
    for line in json:
      if isinstance(line,dict):
        getNames(line,names)


names = []
getNames(school,names)
print(names)

 

если имя присутствует в качестве ключа в приведенном выше json, то его значения будут добавлены в список имен, в противном случае список останется пустым.