如何从复杂的 JSON API 返回嵌套值
Posted
技术标签:
【中文标题】如何从复杂的 JSON API 返回嵌套值【英文标题】:How to Return Nested Values from Complicated JSON API 【发布时间】:2019-05-20 07:43:39 【问题描述】:我正在设置一个气象摄像头,它将提供室外当前状况的实时流,但我还想覆盖来自当地国家气象局的不断更新的天气状况(温度、风速/风向、当前天气)气象站,来自以 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,
显示我收到的输出的一个小sn-p。我希望我可以从这个字符串中单独提取我想要的值,但是我尝试的一切都不起作用。我真的很感激一些指导来完成这段代码,这样我就可以返回我正在寻找的值。我意识到它可能是某种循环或特殊语法。
【问题讨论】:
你需要edit你的问题并用足够的实际JSON输入替换屏幕截图,这样人们就可以在他们的答案中测试代码——原因类似于Why not upload images of code on SO when asking a question?中描述的原因 【参考方案1】:当您说 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])
【讨论】:
我知道 JSON 对于有经验的人来说本身并不“复杂”,但我完全是新手,这是我第一次尝试使用这种嵌套级别的 JSON。我认为这只是一个循环中的一个循环,但我不确定我正在寻找的确切语法。我试试看,非常感谢! @BradHahn 没有任何意义,希望您能享受使用 python/JSON 的乐趣!【参考方案2】:试试这样的:
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 中的字典,我建议您阅读它们。网上搜索应该会找到很多不错的教程。
这有帮助吗?
【讨论】:
是的!这正是我想要的!感谢您深入了解语法以到达我需要的地方。同样,我在这方面完全是新手,所以这真的很有帮助。 很高兴能帮上忙 ;-)以上是关于如何从复杂的 JSON API 返回嵌套值的主要内容,如果未能解决你的问题,请参考以下文章