为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

偶然的你 2021-08-24 16:38:33
这是对这个问题的跟进。问题这个问题也很相似,但不能解决我的问题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 requestsdef 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 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

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


查看完整回答
反对 回复 2021-08-24
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

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


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


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)


查看完整回答
反对 回复 2021-08-24
  • 2 回答
  • 0 关注
  • 230 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信