如何从复杂的JSON API返回嵌套值

时间:2018-12-19 18:59:03

标签: python json api-design

我正在安装一个天气摄像机,该摄像机将提供外部当前状况的实时流,但我也想覆盖本地国家气象局的不断更新的天气状况(温度,风速/方向,当前天气)气象站,来自以JSON格式提供的浏览器API来源。

我已经成功地使用我编写的Python脚本从其他API来源提取了所需的值;但长话短说,API来源不可靠。因此,我正在使用附近机场的官方国家气象服务ASOS站的API。我从中轮询的新API源的输出相当复杂,但是具有各种缩进层。我没有使用Python很长时间,并且在线教程和指南不是针对其他语言(主要是Java或C ++)的,也没有针对我的具体情况。

首先,这是我正在接收的JSON的结构:

screenshot of JSON structure

我强调了要提取的值。它们在OBSERVATIONS部分下列出,与precip_accum_24_hour_value_1wind_gust_value_1wind_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)

这将按预期方式将JSON中OBSERVATIONS下方的所有内容打印为一个长字符串。

{'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 :(得分:0)

当您说JSON很复杂时,它实际上只是主JSON响应中的嵌套字典。您将以与初始JSON blob相同的方式访问它们:

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])

答案 1 :(得分:0)

尝试这样的事情:

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中的字典,建议您阅读一下。在线搜索应该会提供很多很好的教程。

有帮助吗?