遍历嵌套的 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)
这是对这个问题的跟进。
这个问题也类似,但没有解决我的问题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)