如何从复杂的 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_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, 

显示我收到的输出的一个小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 返回嵌套值的主要内容,如果未能解决你的问题,请参考以下文章

BigQuery:从复杂的嵌套 JSON 键值创建列

如何从复杂的 JSON 对象中获取值?

如何按嵌套值对 JSON 对象进行排序?

使用 C# 在复杂的 JSON 数组中查找和打印重复项

如何使用 lodash 从复杂的对象数组中获取值?

使用 LoganSquare 从 JSON 反序列化嵌套字段