如何调用天气接口返回的JSON:从请求到数据解析全指南
在现代应用开发中,天气数据是许多场景(如出行APP、农业监测、物流调度等)的核心需求,获取天气数据最常见的方式是通过调用第三方天气接口,而接口返回的数据通常以JSON格式呈现,本文将详细介绍如何调用天气接口、解析返回的JSON数据,并结合代码示例(以Python和JavaScript为例)帮助开发者快速上手。
天气接口的调用准备
在调用天气接口前,需要完成以下准备工作:
选择天气API服务提供商
目前主流的天气API服务包括:
- 和风天气(https://dev.qweather.com/):提供免费套餐,支持天气查询、预报、生活指数等功能。
- OpenWeatherMap(https://openweathermap.org/):国际常用,免费 tier 可满足基础需求。
- 中国天气网API(http://www.weather.com.cn/):专注国内天气,数据权威但需申请商用授权。
- 心知天气(https://www.seniverse.com/):支持多语言,适合国际化应用。
本文以和风天气为例(免费版可申请1000次/日调用),其他接口调用逻辑类似,仅需替换请求参数和API密钥。
获取API密钥
注册对应天气服务商的账号,在“控制台”创建应用并获取API密钥(Key),例如和风天气的免费密钥需实名认证后申请。
确定接口请求参数
查看API文档,明确请求所需的参数,以和风天气的“实时天气”接口为例:
- 请求URL:
https://api.qweather.com/v7/weather/now - 必需参数:
location:城市ID(需通过“城市搜索”接口获取,如北京的城市ID为101010100)key:你的API密钥
- 可选参数:
unit(返回单位,如m公制单位、i英制单位,默认m)。
调用天气接口并获取JSON响应
通过HTTP请求(GET/POST)向接口URL发送参数,服务器会返回JSON格式的响应数据,以下分别用Python和JavaScript演示调用过程。
Python调用示例(使用requests库)
import requests
# API配置
API_KEY = "你的和风天气API密钥" # 替换为实际密钥
LOCATION_ID = "101010100" # 北京的城市ID
URL = "https://api.qweather.com/v7/weather/now"
# 请求参数
params = {
"location": LOCATION_ID,
"key": API_KEY,
"unit": "m"
}
# 发送GET请求
response = requests.get(URL, params=params)
# 检查请求是否成功(状态码200)
if response.status_code == 200:
json_data = response.json() # 解析JSON响应
print("接口返回的JSON数据:")
print(json_data)
else:
print(f"请求失败,状态码:{response.status_code}")
print(f"错误信息:{response.text}")
输出示例:
{
"code": "200",
"now": {
"obsTime": "2023-10-01T14:30+08:00",
"temp": "22",
"feelsLike": "24",
"icon": "100",
"text": "晴",
"wind360": "135",
"windDir": "东南风",
"windScale": "3",
"windSpeed": "12",
"humidity": "45",
"precip": "0.0",
"pressure": "1015",
"vis": "10",
"cloud": "10"
},
"refer": {
"sources": [],
"license": []
}
}
JavaScript调用示例(使用fetch API)
// API配置
const API_KEY = "你的和风天气API密钥"; // 替换为实际密钥
const LOCATION_ID = "101010100"; // 北京的城市ID
const URL = `https://api.qweather.com/v7/weather/now?location=${LOCATION_ID}&key=${API_KEY}&unit=m`;
// 发送GET请求
fetch(URL)
.then(response => {
if (!response.ok) {
throw new Error(`请求失败,状态码:${response.status}`);
}
return response.json(); // 解析JSON响应
})
.then(jsonData => {
console.log("接口返回的JSON数据:");
console.log(jsonData);
})
.catch(error => {
console.error("错误信息:", error);
});
输出结果与Python示例一致,此处不再赘述。
解析JSON数据的核心字段
接口返回的JSON通常包含多层嵌套结构,需根据业务需求提取关键字段,以上述和风天气的响应为例,常见字段解析如下:
顶层字段
code:接口状态码(200表示成功,其他值见API文档错误码说明)。now:实时天气数据的核心对象(嵌套结构)。refer:数据来源和授权信息(如sources为数据提供方,license为数据许可证)。
now对象中的关键字段
| 字段名 | 含义 | 示例值 |
|---|---|---|
obsTime |
观测时间 | "2023-10-01T14:30+08:00" |
temp |
实时温度(摄氏度) | "22" |
feelsLike |
体感温度(摄氏度) | "24" |
icon |
天气图标代码 | "100" (对应晴天) |
text |
天气描述 | "晴" |
windDir |
风向 | "东南风" |
windScale |
风力等级 | "3" |
humidity |
相对湿度(%) | "45" |
pressure |
气压(hPa) | "1015" |
提取关键数据的代码示例
Python提取示例
if json_data["code"] == "200":
now = json_data["now"]
print(f"当前温度:{now['temp']}℃(体感温度:{now['feelsLike']}℃)")
print(f"天气状况:{now['text']}")
print(f"风向风力:{now['windDir']} {now['windScale']}级")
print(f"湿度:{now['humidity']}%")
else:
print(f"接口返回错误:{json_data['code']}")
JavaScript提取示例
if (jsonData.code === "200") {
const now = jsonData.now;
console.log(`当前温度:${now.temp}℃(体感温度:${now.feelsLike}℃)`);
console.log(`天气状况:${now.text}`);
console.log(`风向风力:${now.windDir} ${now.windScale}级`);
console.log(`湿度:${now.humidity}%`);
} else {
console.error(`接口返回错误:${jsonData.code}`);
}
处理JSON数据的常见问题
错误码处理
接口可能因参数错误、密钥无效、超出调用次数等返回错误,需根据code字段处理:
- 和风天气常见错误码:
200(成功)、401(密钥无效)、404(城市ID不存在)、429(调用超限)。
示例(Python错误处理):
if json_data["code"] == "200":
# 正常处理数据
pass
elif json_data["code"] == "401":
print("错误:API密钥无效,请检查密钥是否正确")
elif json_data["code"] == "429":
print("错误:今日调用次数已超限,请升级套餐或明日重试")
else:
print(f"接口返回未知错误:{json_data['code']}")
数据格式转换
JSON中的数值可能是字符串类型(如"22"),需根据业务需求转换为数字:
- Python:
int(now["temp"])或float(now["temp"]) - JavaScript:
Number(now.temp)或parseInt(now.temp)
嵌套数据的遍历
若JSON结构复杂(如预报数据包含多日天气),可通过循环遍历嵌套数组:
示例(和风天气“3天预报”接口响应):
{
"code": "200",
"daily": [
{
"fxDate": "2023-10-01",
"tempMax": "


还没有评论,来说两句吧...