一、解决思路
1、首先获取泸州的城市代码
在返回的数据里,第一项的ref值就是泸州的城市代码:101271001
2、利用国家气象局提供的接口访问泸州的天气信息
二、准备工作
学会如何在Java程序里解析json。
准备jar包
连接:链接: 点击这里 提取码: 3nqw
1、创建Java项目JsonDemo
ParseJsonString
package net.qing.json;
import org.json.JSONObject;
/**
* 功能:将json字符串解析成json对象
* 将json数组字符串解析成json数组
* 日期:2019:10:31
*/
public class ParseJsonString {
public static void main(String[] args) {
//定义一个json字符串
String strJson = "{'id':1,'name':'qing','age':100}";
//基于json字符串创建json对象
try {
//基于json字符串创建json对象
JSONObject jsonObject = new JSONObject(strJson);
//打印输出json对象
System.out.println(jsonObject);
//遍历json对象
System.out.println("id:"+jsonObject.get("id"));
System.out.println("name:"+jsonObject.get("name"));
System.out.println("age:"+jsonObject.get("age"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
ParseJsonString02
package net.qing.json;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class ParseJsonString02 {
public static void main(String[] args) {
//定义json数组字符串
String strJsonArr = "[{'id':1,'name':'qing','age':100}," +
"{'id':2,'name':'peng','age':10},"+
"{'id':3,'name':'lzb','age':190}]";
try {
//基于json数组字符串创建数组
JSONArray jsonArray = new JSONArray(strJsonArr);
//遍历json数组
for (int i = 0; i<jsonArray.length();i++){
System.out.println(jsonArray.get(i));
}
} catch (JSONException e) {
e.printStackTrace();
}
}
}
三、功能实现
1、创建web项目并准备jar包
2、修改项目首页文件index.jsp
3、在web目录里创建查询天气页面query_weather.jsp
4、在web目录里创建处理查询天气页面do_query_weather.jsp
(1)显示表单提交的城市名数据
3)编写通过城市名查询天气信息的方法
<%!
……
/**
* 通过城市名获取天气信息
*
* @param cityName
* @return 天气信息
*/
public HashMap<String, String> getWeatherInfo(String cityName) throws JSONException {
// 定义天气信息哈希映射
HashMap<String, String> weather = new HashMap<>();
try {
// 获取城市代码
String cityCode = getCityCode(cityName);
// 定义url字符串
String strUrl = "http://t.weather.sojson.com/api/weather/city/" + cityCode;
// 创建URL对象
URL url = new URL(strUrl);
// 创建http连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 建立连接
connection.connect();
// 获取响应码
int code = connection.getResponseCode();
// 判断是否连接成功
if (code == 200) {
// 获取字节输入流
InputStream is = connection.getInputStream();
// 创建字节数组用于保存响应信息
byte[] buffer = new byte[is.available()];
// 读取字节输入流全部信息
is.read(buffer);
// 获取响应信息字符串
String response = new String(buffer, "utf-8");
// 将json字符串转换成json对象
JSONObject weatherInfoJsonObj = new JSONObject(response);
System.out.println(weatherInfoJsonObj);
JSONObject cityInfoJsonObj = new JSONObject(weatherInfoJsonObj.getString("cityInfo"));
weather.put("城市:", cityInfoJsonObj.getString("parent") + " " + cityInfoJsonObj.getString("city") + "[" + cityCode + "]");
JSONArray forcastJsonArr = new JSONArray(new JSONObject(weatherInfoJsonObj.getString("data")).getString("forecast"));
weather.put("时间:", weatherInfoJsonObj.getString("time") + " " + forcastJsonArr.getJSONObject(0).getString("week"));
weather.put("温度:", forcastJsonArr.getJSONObject(0).getString("high") + " " + forcastJsonArr.getJSONObject(0).getString("low"));
weather.put("天气:", forcastJsonArr.getJSONObject(0).getString("type"));
} else {
weather.put("错误:", "[" + cityName + "]不存在!");
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
// 返回天气信息哈希映射
return weather;
}
%>
do_query_weather.jsp页面完整代码
<%@ page import="java.net.URL" %>
<%@ page import="java.net.HttpURLConnection" %>
<%@ page import="java.io.IOException" %>
<%@ page import="java.io.InputStream" %>
<%@ page import="java.net.URLEncoder" %>
<%@ page import="org.json.JSONObject" %>
<%@ page import="org.json.JSONArray" %>
<%@ page import="org.json.JSONException" %>
<%@ page import="java.util.HashMap" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>显示城市天气信息</title>
</head>
<body>
<%!
/**
* 获取城市代码
*
* @param cityName
* @return 城市代码
*/
public String getCityCode(String cityName) {
// 定义城市代码
String cityCode = "";
try {
// 定义url字符串
String strUrl = "http://toy1.weather.com.cn/search?cityname=" + URLEncoder.encode(cityName, "utf-8");
// 创建URL对象
URL url = new URL(strUrl);
// 利用URL对象获取HTTP连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 建立物理连接
conn.connect();
// 获取响应码
int responseCode = conn.getResponseCode();
// 判断连接是否成功
if (responseCode == HttpURLConnection.HTTP_OK) { // 200
// 获取字节输入流
InputStream is = conn.getInputStream();
// 定义字节数组用于保存字节输入流的全部内容
byte[] buffer = new byte[is.available()];
// 判断城市是否存在
if (is.available() > 4) {
// 读取字节输入流全部信息,保存到buffer
is.read(buffer);
// 获取响应信息字符串
String response = new String(buffer, "utf-8");
// 截取出城市代码
cityCode = response.substring(10, 19);
}
}
} catch (IOException e) {
e.printStackTrace();
}
// 返回城市代码
return cityCode;
}
/**
* 通过城市名获取天气信息
*
* @param cityName
* @return 天气信息
*/
public HashMap<String, String> getWeatherInfo(String cityName) throws JSONException {
// 定义天气信息哈希映射
HashMap<String, String> weather = new HashMap<>();
try {
// 获取城市代码
String cityCode = getCityCode(cityName);
// 定义url字符串
String strUrl = "http://t.weather.sojson.com/api/weather/city/" + cityCode;
// 创建URL对象
URL url = new URL(strUrl);
// 创建http连接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// 建立连接
connection.connect();
// 获取响应码
int code = connection.getResponseCode();
// 判断是否连接成功
if (code == 200) {
// 获取字节输入流
InputStream is = connection.getInputStream();
// 创建字节数组用于保存响应信息
byte[] buffer = new byte[is.available()];
// 读取字节输入流全部信息
is.read(buffer);
// 获取响应信息字符串
String response = new String(buffer, "utf-8");
// 将json字符串转换成json对象
JSONObject weatherInfoJsonObj = new JSONObject(response);
System.out.println(weatherInfoJsonObj);
JSONObject cityInfoJsonObj = new JSONObject(weatherInfoJsonObj.getString("cityInfo"));
weather.put("城市:", cityInfoJsonObj.getString("parent") + " " + cityInfoJsonObj.getString("city") + "[" + cityCode + "]");
JSONArray forcastJsonArr = new JSONArray(new JSONObject(weatherInfoJsonObj.getString("data")).getString("forecast"));
weather.put("时间:", weatherInfoJsonObj.getString("time") + " " + forcastJsonArr.getJSONObject(0).getString("week"));
weather.put("温度:", forcastJsonArr.getJSONObject(0).getString("high") + " " + forcastJsonArr.getJSONObject(0).getString("low"));
weather.put("天气:", forcastJsonArr.getJSONObject(0).getString("type"));
} else {
weather.put("错误:", "[" + cityName + "]不存在!");
}
} catch (IOException e) {
e.printStackTrace();
} catch (JSONException e) {
e.printStackTrace();
}
// 返回天气信息哈希映射
return weather;
}
%>
<%
// 设置请求对象字符编码
request.setCharacterEncoding("utf-8");
// 获取表单提交的数据(城市名)
String cityName = request.getParameter("city_name");
// 输出天气信息
HashMap<String, String> weather = getWeatherInfo(cityName);
for (String key: weather.keySet()) {
out.print(key + weather.get(key) + "<br/>");
}
%>
</body>
</html>