Как вернуть вложенные значения из сложного JSON API - PullRequest
0 голосов
/ 19 декабря 2018

Я настраиваю метеорологическую камеру, которая будет обеспечивать прямую трансляцию текущих условий на улице, но я также хотел бы накладывать постоянно обновляемые погодные условия (температура, скорость / направление ветра, текущая погода) из местной Национальной службы погодыметеостанция из источника API браузера, предоставленного в формате JSON.

Я успешно извлек нужные значения из другого источника API с помощью написанного мной скрипта Python;Однако, короче говоря, API-источник ненадежен.Поэтому я использую API с официальной станции ASOS Национальной службы погоды в моем ближайшем аэропорту.Вывод из нового источника API, из которого я опрашиваю, довольно сложен, однако с различными уровнями отступов.Я не работал с Python очень долго, и учебные пособия и руководства онлайн были либо для других языков (в основном Java или C ++), либо не работали для моего конкретного случая.

Прежде всего, вот структура JSON, который я получаю:

screenshot of JSON structure

Я подчеркнул значения, которые я пытаюсьизвлечь.Они перечислены в разделе OBSERVATIONS, связанном с precip_accum_24_hour_value_1, wind_gust_value_1, wind_cardinal_direction_value_1d и т. Д.Проблема в том, что под каждым наблюдением есть два значения, поэтому сценарий, который я пробовал, не возвращает значения, которые я хочу.Вот код, который я попробовал:

import urllib.request
import json

f = urllib.request.urlopen('https://api.synopticdata.com/v2/stations/latest?token=8c96805fbf854373bc4b492bb3439a67&stid=KSTC&complete=1&units=english&output=json')

json_string = f.read()
parsed_json = json.loads(json_string)

for each in parsed_json['STATION']:
    observations = each['OBSERVATIONS']

print(observations)

Это распечатывает все под OBSERVATIONS в JSON, как и ожидалось, в виде одной длинной строки.

{'precip_accum_24_hour_value_1': {'date_time': '2018-12-06T11:53:00Z', 'value': 0.01}, 'wind_gust_value_1': {'date_time': '2018-12-12T01:35:00Z', 'value': 14.0}, 

, чтобы показать небольшой фрагмент вывода, который я получаю.Я надеялся, что смогу по отдельности извлечь нужные значения из этой строки, но все, что я пытался, не работает.Я был бы очень признателен за некоторые рекомендации по завершению этого фрагмента кода, чтобы я мог вернуть значения, которые я ищу.Я понимаю, что это может быть какой-то цикл или специальный синтаксис.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Попробуйте что-то вроде этого:

for each in parsed_json['STATION']:
    observations = each['OBSERVATIONS']
    for k, v in observations.items():
        print(k, v["value"])

JSON хорошо отображается в словарь и список типов Python, поэтому доступ к подструктурам может быть выполнен с синтаксисом a[<index-or-key>].Итерация по парам ключ-значение словаря может быть выполнена, как я показал выше.Если вы еще не знакомы со словарями в python, я бы порекомендовал прочитать о них.Поиск в Интернете должен дать много хороших учебников.

Помогает ли это?

0 голосов
/ 19 декабря 2018

Когда вы говорите, что JSON сложный, это просто вложенные словари в основном ответе JSON.Вы будете обращаться к ним так же, как к исходному BLOB-объекту JSON:

import urllib.request
import json

f = urllib.request.urlopen('https://api.synopticdata.com/v2/stations/latest?token=8c96805fbf854373bc4b492bb3439a67&stid=KSTC&complete=1&units=english&output=json')

json_string = f.read()
parsed_json = json.loads(json_string)

for each in parsed_json['STATION']:
    for value in each:
        print(value, each[value])
...