我正在安装一个天气摄像机,该摄像机将提供外部当前状况的实时流,但我也想覆盖本地国家气象局的不断更新的天气状况(温度,风速/方向,当前天气)气象站,来自以JSON格式提供的浏览器API来源。
我已经成功地使用我编写的Python脚本从其他API来源提取了所需的值;但长话短说,API来源不可靠。因此,我正在使用附近机场的官方国家气象服务ASOS站的API。我从中轮询的新API源的输出相当复杂,但是具有各种缩进层。我没有使用Python很长时间,并且在线教程和指南不是针对其他语言(主要是Java或C ++)的,也没有针对我的具体情况。
首先,这是我正在接收的JSON的结构:
我强调了要提取的值。它们在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)
这将按预期方式将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},
显示我正在接收的输出的一小段。我希望我可以从该字符串中单独提取所需的值,但是我尝试的所有方法都无法正常工作。我非常感谢您完成此段代码的一些指导,以便可以返回所需的值。我意识到这可能是某种循环或特殊语法。
答案 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中的字典,建议您阅读一下。在线搜索应该会提供很多很好的教程。
有帮助吗?