作者:wiggin | 来源:互联网 | 2023-09-09 18:24
实验目的:
- 理解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集合并返回。
public static List getInfosFromJson(String json)throws IOException {Gson gson=new Gson();//使用gson库解析JSON数据System.out.println(json);Type listType = new TypeToken>(){}.getType();List 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 weatherInfos = null;//调用getInfosFromJson()方法,将天气信息集合保存到weatherInfos中try {weatherInfos=getInfosFromJson(json);} catch (IOException e) {e.printStackTrace();}//循环读取weatherInfos中的每一条数据list = new ArrayListfor (WeatherInfo info : weatherInfos) {map = new HashMap();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]
项目连接:https://download.csdn.net/download/qq_47112287/85415825https://download.csdn.net/download/qq_47112287/85415825