这是此问题的后续措施。 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
答案 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)