рекурсивный разбор API-данных JSI с использованием Python - PullRequest
0 голосов
/ 06 апреля 2019

метод, который принимает ключ в качестве ввода и ищет этот ключ во всех данных 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'
]

1 Ответ

0 голосов
/ 06 апреля 2019

Вы просто открываете файл, но не читаете его. Таким образом, чтобы загрузить и прочитать его как json, вы можете использовать json.load().

Вот модифицированный код:

import json

filedata = open('testdata.json','r')
filedata = json.load(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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...