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

时间:2018-11-21 14:39:34

标签: python json nested traversal

这是此问题的后续措施。 Question

这个问题也很相似,但不能解决我的问题Question2

我正在尝试解析嵌套的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 :(得分:1)

您的代码显示了附加,但您要求计数。如果我正确理解,这是一种递归的方式来获取此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的子孩子,这意味着您需要额外的条件,但是如果最终是这样,则取决于您。

答案 1 :(得分:0)

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

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

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)