实验项目:解析JSON数据实现天气预报显示

实验目的:

  1. 理解JSON数据的基本结构
  2. 掌握使用Gson解析JSON数据的方法

实验内容:
使用解析JSON文件获取天气预报信息,并将不同城市的天气信息显示在主界面中,应用程序运行时界面如图1所示。单击其他城市按钮时,将显示相应城市对应的天气信息,如图2所示。

实验项目:解析JSON数据实现天气预报显示_第1张图片实验项目:解析JSON数据实现天气预报显示_第2张图片

图1 程序运行初始界面                         图2 切换城市天气显示界面

实验步骤:

  1.  TestServer服务器端,在WebRoot文件夹下新建weather.json文件,使其包含三个城市的天气信息,每一个城市天气都由tempweathernamepmwind属性组成,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级"}

]
  1. 导入项目原始代码,在MainActivity.javaonCreate()方法内部,通过访问服务器获取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();

  1. 在模块的Dependencies选项中添加Gson依赖库。
implementation 'com.google.code.gson:gson:2.8.6'
  1. 在模块对应的包名下创建JSON数据对应的实体类WeatherInfo类,实体类中的成员名称要与JSON数组的key值一致,并为每个属性添加getset方法。
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;}
  1. 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;

}
  1. 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 ArrayList>();

            for (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);

            }}};

实验运行结果截图:

实验项目:解析JSON数据实现天气预报显示_第3张图片实验项目:解析JSON数据实现天气预报显示_第4张图片

 

 

图1 程序运行初始界面                         图2 切换城市天气显示界面

实验总结:

在此次的实验中:

一是对于OKhttp的移动端和服务端的数据交换有了更为清楚的认识,可以更加熟练的使用OKhttp进行数据的访问和交换;

二是对于json的数据交换和访问也进行了学习可以更好的进行json数据的获取、解析、利用;

另外再此次的实验过程由于自己的粗心,将json文件中的一个英文符号写成了中文,导致了程序的运行的失败;

Unterminated array at line 2 column 68 path $[2]

项目连接:https://download.csdn.net/download/qq_47112287/85415825icon-default.png?t=M4ADhttps://download.csdn.net/download/qq_47112287/85415825

你可能感兴趣的:(android,java,json,android)