实验项目:解析JSON数据实现天气预报显示
实验目的:
- 理解JSON数据的基本结构
- 掌握使用Gson解析JSON数据的方法
实验内容:
使用解析JSON文件获取天气预报信息,并将不同城市的天气信息显示在主界面中,应用程序运行时界面如图1所示。单击其他城市按钮时,将显示相应城市对应的天气信息,如图2所示。
图1 程序运行初始界面 图2 切换城市天气显示界面
实验步骤:
- TestServer服务器端,在WebRoot文件夹下新建weather.json文件,使其包含三个城市的天气信息,每一个城市天气都由temp、weather、name、pm和wind属性组成,json文件如下:
[
{"temp":"20℃/30℃","weather":"晴转多云","name":"上海","pm":"80","wind":"1级"},
{"temp":"15℃/24℃","weather":"晴","name":"北京","pm":"98","wind":"3级"},
{"temp":"26℃/32℃","weather":"多云","name":"广州","pm":"30","wind":"2级"}
]
- 导入项目原始代码,在MainActivity.java中onCreate()方法内部,通过访问服务器获取JSON数据并将数据封装到消息中发送给UI线程。
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client=new OkHttpClient();
Request request=new Request.Builder().url(urlStr).build();//是两边的类型相匹配
Response response=client.newCall(request).execute();//返回的响应的数据
// Call call=client.newCall(request);
// Response response=call.execute();
System.out.println("********respnse详细信息***:"+response);
if (response.isSuccessful()){
String str=response.body().string();
System.out.println("*****************这是一个分机线***************************");
System.out.println(str);
Message msg=Message.obtain();//获取message对象obj,传递数据
msg.obj=str;
System.out.println(msg.obj);
handler.sendMessage(msg);
}else{
System.out.println("response失败");
} } catch (IOException e) {
e.printStackTrace();
} }}).start();
- 在模块的Dependencies选项中添加Gson依赖库。
implementation 'com.google.code.gson:gson:2.8.6'
- 在模块对应的包名下创建JSON数据对应的实体类WeatherInfo类,实体类中的成员名称要与JSON数组的key值一致,并为每个属性添加get和set方法。
public String getTemp() {return temp;}
public void setTemp(String temp) {this.temp = temp;}
public String getWeather() {return weather;}
public void setWeather(String weather) {this.weather = weather;}
public String getName() {return name;}
public void setName(String name) { this.name = name;}
public String getPm() { return pm;}
public void setPm(String pm) { this.pm = pm;}
public String getWind() { return wind;}
public void setWind(String wind) { this.wind = wind;}
- 在MainActivity.java中完成getInfosFromJson()方法。采用Gson库来解析JSON格式的字符串,并解析后的数据存入List<WeatherInfo>集合并返回。
public static List<WeatherInfo> getInfosFromJson(String json)
throws IOException {
Gson gson=new Gson();//使用gson库解析JSON数据
System.out.println(json);
Type listType = new TypeToken<List<WeatherInfo>>(){}.getType();
List<WeatherInfo> list = gson.fromJson(json,listType);
System.out.println(json);
return list;
}
- 在Handler对象的handleMessage()方法中,调用getInfosFromJson()方法解析获取到的JSON数据,并将天气信息集合保存到weatherInfos中。
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
//获取子线程传递过来的json数据并保存到变量中
String json= (String) msg.obj;
System.out.println(json);
List<WeatherInfo> weatherInfos = null;
//调用getInfosFromJson()方法,将天气信息集合保存到weatherInfos中
try {
weatherInfos=getInfosFromJson(json);
} catch (IOException e) {
e.printStackTrace();
}
//循环读取weatherInfos中的每一条数据
list = new ArrayList<Map<String, String>>();
for (WeatherInfo info : weatherInfos) {
map = new HashMap<String, String>();
map.put("temp", info.getTemp());
map.put("weather", info.getWeather());
map.put("name", info.getName());
map.put("pm", info.getPm());
map.put("wind", info.getWind());
list.add(map);
}}};
实验运行结果截图:
图1 程序运行初始界面 图2 切换城市天气显示界面
实验总结:
在此次的实验中:
一是对于OKhttp的移动端和服务端的数据交换有了更为清楚的认识,可以更加熟练的使用OKhttp进行数据的访问和交换;
二是对于json的数据交换和访问也进行了学习可以更好的进行json数据的获取、解析、利用;
另外再此次的实验过程由于自己的粗心,将json文件中的一个英文符号写成了中文,导致了程序的运行的失败;
Unterminated array at line 2 column 68 path $[2]
更多推荐
所有评论(0)