#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, то его значения будут добавлены в список имен, в противном случае список останется пустым.