遍历嵌套的 json object 并存储值 - Python

Travers through a nested json object and store values- Python

这是对这个问题的跟进。

这个问题也类似,但没有解决我的问题Question2

我正在尝试解析嵌套的 json 以获取检查特定位置有多少 children,我正在尝试检查是否 "children:" = None 并递增计数器以检查如何为了获得最低的 child,我需要降低许多级别,或者 更有效的解决方案是:

我需要将所有 child 值放入一个列表中并继续直到 "children:" = None

Json object 可以增加 children 的数量,所以我们可以有多个级别的 children,如果我想的话会变得混乱嵌套列表并获取值,我怎样才能动态地做到这一点?

{
    '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

您的代码显示追加,但您要求计数。如果我对你的理解正确的话,这里有一个递归的方法来获取这个 JSON 中 children 的数量:

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 的 subchildren 这意味着你需要额外的条件,但如果最终是这样,那取决于你。

我找到了解决问题的方法,

以下代码将获取所有子项并将它们附加到列表中

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)