如何 Return 从复杂的 JSON API 中嵌套值
How to Return Nested Values from Complicated JSON API
我正在设置一个天气摄像头,它将提供室外当前状况的实时流,但我也想叠加不断更新的天气状况(温度、风 speed/direction、当前天气)本地国家气象局气象站,来自浏览器 API 以 JSON 格式提供的来源。
我已经使用我编写的 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
等关联。问题是每个观察下都有两个值,所以我尝试的脚本不是 returning 我想要的值。这是我试过的代码:
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},
显示我收到的一小段输出。我希望我可以从这个字符串中单独提取我想要的值,但是我尝试的一切都不起作用。我真的很感谢完成这段代码的一些指导,这样我就可以 return 我正在寻找的值。我意识到这可能是某种循环或特殊语法。
当您说 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])
尝试这样的事情:
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 中的词典,我建议您阅读它们。网上搜一下应该会有很多不错的教程。
这有帮助吗?
我正在设置一个天气摄像头,它将提供室外当前状况的实时流,但我也想叠加不断更新的天气状况(温度、风 speed/direction、当前天气)本地国家气象局气象站,来自浏览器 API 以 JSON 格式提供的来源。
我已经使用我编写的 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
等关联。问题是每个观察下都有两个值,所以我尝试的脚本不是 returning 我想要的值。这是我试过的代码:
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},
显示我收到的一小段输出。我希望我可以从这个字符串中单独提取我想要的值,但是我尝试的一切都不起作用。我真的很感谢完成这段代码的一些指导,这样我就可以 return 我正在寻找的值。我意识到这可能是某种循环或特殊语法。
当您说 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])
尝试这样的事情:
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 中的词典,我建议您阅读它们。网上搜一下应该会有很多不错的教程。
这有帮助吗?