Обходит через вложенный объект json и сохраняет значения - Python - PullRequest
0 голосов
/ 21 ноября 2018

Это продолжение этого вопроса. Вопрос

Также этот вопрос похож, но не решает мою проблему Вопрос2

Я пытаюсь разобрать вложенный json, чтобы получить Проверьте, сколькоДля детей в определенном месте, я пытаюсь проверить, если "children:" = None, и счетчик приращений, чтобы проверить, сколько уровней мне нужно пройти, чтобы получить младшего ребенка, или было бы более эффективное решение:

Мне нужно собрать все дочерние значения в список и продолжать до тех пор, пока "children:" = None.

Объект Json может увеличиться в количестве дочерних элементов, поэтому у нас может быть несколько уровней дочерних элементов, что может привести к беспорядку, если яхочу вложить список и получить значения, как я могу сделать это динамически?

{
    'locationId': 'location1',
    'name': 'Name',
    'type': 'Ward',
    'patientId': None,
    'children': [{
        'locationId': 'Child_location2',
        'name': 'Name',
        'type': 'Bed',
        'patientId': None,
        'children': [{
            'locationId': 'Child_Child_location3',
            'name': 'Name',
            'type': 'HospitalGroup',
            'patientId': None,
            'children': None
        }]
    }, {
        'locationId': 'location4',
        'name': 'Name',
        'type': 'Hospital',
        'patientId': None,
        'children': None
    }, {
        'locationId': 'location5',
        'name': 'Name',
        'type': 'Bed',
        'patientId': None,
        'children': None
    }, {
        'locationId': 'location6',
        'name': 'Name',
        'type': 'Bed',
        'patientId': None,
        'children': None
    }, {
        'locationId': 'location27',
        'name': 'Name',
        'type': 'Bed',
        'patientId': None,
        'children': None
    }]
}

Я пытался сделать что-то вроде этого

import requests
def Get_Child(URL, Name):
        headers = {
            'accept': 'text/plain',
        }

        response = requests.get(
            URL + Name,
            headers=headers)
        json_data = response.json()
        print (json_data)
        list = []
        for locationId in json_data['locationId']:
            list.append(locationId)
            for children in locationId['children']:
                list.append(children)

, но это дает мне следующую ошибку,

for children in locationId['locationId']: TypeError: string indices must be integers

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Я нашел решение для моей проблемы,

Следующий код получит всех детей и добавит их в список

class Children():
  def Get_All_Children(self,json_input, lookup_key):
      if isinstance(json_input, dict):
          for k, v in json_input.items():
              if k == lookup_key:
                  yield v
              else:
                  yield from self.Get_All_Children(v, lookup_key)
      elif isinstance(json_input, list):
          for item in json_input:
              yield from self.Get_All_Children(item, lookup_key)


for locations in self.Get_All_Children(self.json_data, 'locationId'):
    self.mylist.append(locations)
0 голосов
/ 21 ноября 2018

Ваш код показывает добавление, но вы просите счет.Вот рекурсивный способ узнать количество детей в этом JSON, если я вас правильно понимаю:

def get_children(body, c=1):
    if not body.get('children'):
        c += 1
    elif isinstance(body.get('children'), list):
            c += 1
            for subchild in body.get('children'):
                c += 1
                get_children(subchild, c)
    return c

counts = get_children(your_json_blob)
print(counts)
>>> 7

Редактировать: я специально не использовал if/else, потому что я не знаю, можете ли вы иметьдети, которые dict, а не list, что означало бы, что вам потребуются дополнительные условия, но это зависит от вас, если в конечном итоге это так.

...