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

这是对这个问题的跟进。问题


这个问题也很相似,但不能解决我的问题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


偶然的你
浏览 231回答 2
2回答

潇湘沐

您的代码显示追加,但您要求计数。如果我对您的理解正确,这是一种递归方式来获取此 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 ccounts = get_children(your_json_blob)print(counts)>>> 7编辑:我故意没有使用,if/else因为我不知道你是否可以有子孩子,dict而不是list这意味着你需要额外的条件,但如果最终是这种情况,这取决于你。

慕运维8079593

我找到了解决我的问题的方法,以下代码将获取所有子项并将它们附加到列表中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)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python