метод, который принимает ключ в качестве ввода и ищет этот ключ во всех данных json и возвращает список пары значений ключа этого ключа
этот метод работает нормально для пары нормальных значений ключа ('ключ'): 'some value'), но если значением для ключа является список или словарь ('keya': '[1,2,3]'), возвращается пустой список
filedata=open('testdata.json','r')
filedata=json.loads(filedata)
def extract_values(obj, key):
"""Pull all values of specified key from nested JSON."""
arr = []
def extract(obj, arr, key):
"""Recursively search for values of key in JSON tree."""
if isinstance(obj, dict):
for k, v in obj.items():
if isinstance(v, (dict, list)):
extract(v, arr, key)
elif k == key:
arr.append(v)
elif isinstance(obj, list):
for item in obj:
extract(item, arr, key)
return arr
results = extract(obj, arr, key)
return results
z=extract_values(filedata,'text')
print(z)
Входные данные:
{
"destination_addresses": [
"Washington, DC, USA",
"Philadelphia, PA, USA",
"Santa Barbara, CA, USA",
"Miami, FL, USA",
"Austin, TX, USA",
"Napa County, CA, USA"
],
"origin_addresses": [
"New York, NY, USA"
],
"rows": [
{
"elements": [
{
"distance": {
"text": "227 mi",
"value": 365468
},
"duration": {
"text": "3 hours 54 mins",
"value": 14064
},
"status": "OK"
},
{
"distance": {
"text": "94.6 mi",
"value": 152193
},
"duration": {
"text": "1 hour 44 mins",
"value": 6227
},
"status": "OK"
},
{
"distance": {
"text": "2,878 mi",
"value": 4632197
},
"duration": {
"text": "1 day 18 hours",
"value": 151772
},
"status": "OK"
},
{
"distance": {
"text": "1,286 mi",
"value": 2069031
},
"duration": {
"text": "18 hours 43 mins",
"value": 67405
},
"status": "OK"
},
{
"distance": {
"text": "1,742 mi",
"value": 2802972
},
"duration": {
"text": "1 day 2 hours",
"value": 93070
},
"status": "OK"
},
{
"distance": {
"text": "2,871 mi",
"value": 4620514
},
"duration": {
"text": "1 day 18 hours",
"value": 152913
},
"status": "OK"
}
]
}
],
"status": "OK"
}
Возвращает пустой список:
[]
Ожидаемый результат:
[
'227 mi',
'3 hours 54 mins',
'94.6 mi',
'1 hour 44 mins',
'2,878 mi',
'1 day 18 hours',
'1,286 mi',
'18 hours 43 mins',
'1,742 mi',
'1 day 2 hours',
'2,871 mi',
'1 day 18 hours'
]