使用Gson解析数据

一. 简介及资源

之前写了一篇Volley的网络请求获取数据,这篇就是接着的,使用Gson来解析数据并展示出来,希望对萌新有所帮助,

我的资源依旧免费,哈哈,只为方便。

jar包地址:链接: https://pan.baidu.com/s/18DXgGPDBTnsbKvb2FsBG5A 

密码: 2f27

二. 配置

导入jar包后,一样需要Add As Library,使用jar包,如图:


add之后,如图:


这样我们就配置好了,接下来就是使用了

三. 实现

(1)url接口

解析数据肯定是需要数据源的,我用的是心知天气(我没收广告费)

private static final String url = "https://api.seniverse.com/v3/weather/daily.json?key=2szocxukyfblxx7d&location=shenzhen&language=zh-Hans&unit=c&start=0&days=1";

url的具体参数我就不去解释了,想知道的可以自己去看,有时我们项目也是需要获取天气的

(2)生成bean

有了数据源之后,我们还需要生成对应的bean文件,这样才能准确的获取各个数据,注意名称要和数据源的一样哦,

不然会出现解析错误。推荐大家一个Json转Java bean的工具,没用这工具之前,我们是要一个一个自己去写的,还怕

写错,用了之后,嘿嘿嘿,谁用谁知道。

工具地址:http://www.atool.org/json2javabean.php


把你从url获取的数据粘贴到上面的空白处,Class是url最外层的类(results),Package是你的项目包名,这里写自己的包名是

为了方便,生成后直接复制粘贴即可,不知道项目包名的萌新可以打开清单文件(AdnroidManifest.xml),如图:


点击生成JavaBean,就会根据你给的url自动生成一个或多个bean类,如图:


大写的Success,表示生成成功,如果url错误会提示哪错了。

生成后会有一段注释,这个不用管它,也不用粘贴到项目中,当然粘贴了也没事。

至此bean文件生成完毕。

(3)代码实现

public class MainActivity extends AppCompatActivity {

    //url接口
    private static final String url = "https://api.seniverse.com/v3/weather/daily.json?key=2szocxukyfblxx7d" +
            "&location=shenzhen&language=zh-Hans&unit=c&start=0&days=1";

    private Button btnStart;
    private TextView tvShow;

    Gson gson;

    private Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case 1:
                    String jsonData = (String) msg.obj;
                    Log.i("textShow", "s = " + jsonData);   //打印传过来的Json数据
                    GsonData(jsonData);     //解析数据
                    break;
            }
        }

    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gson = new Gson();
        initView();
    }

    private void initView() {
        btnStart = (Button) findViewById(R.id.main_btn_start);
        tvShow = (TextView) findViewById(R.id.main_tv_show);

        btnStart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                StringRequest request = new StringRequest(Request.Method.GET, url
                        , new Response.Listener<String>() {
                    @Override
                    public void onResponse(String s) {
                        Message msg = new Message();
                        msg.what = 1;
                        msg.obj = s;
                        handler.sendMessage(msg);
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError volleyError) {

                    }
                });
                MyApplication.requestQueue.add(request);
            }
        });
    }

    private void GsonData(String json) {
        WeatherBean weather = gson.fromJson(json, WeatherBean.class);
        List<Results> results = weather.getResults();
        tvShow.setText("path :"+ results.get(0).getLocation().getPath()); //当数据多,需要获取所有数据时,需要写一个for循环来获取数据
    }
}

注: 这代码还是很简单的,有看不懂的请结合我的上一篇Volley网络请求看

Volley网络请求:https://blog.csdn.net/qq_26446715/article/details/80049564

(4)权限

<uses-permission android:name="android.permission.INTERNET"/>

(5)效果图


(6)拓展

很多时候我们面对的都是多层嵌套的json数据,这时我们单独用Gson解析会有部分数据解析不出来,显示null,

我们就需要用到JSONObject+JSONArray了,下面我们来看看怎么使用他们吧。



这是同一个收缩和展开的json数据,我们通过这两个来讲解更容易理解,不用那么抽象

JSONObject : “{}”大括号包裹的是对象,比如图中的location.

JSONArray : “[]”中括号包裹的是数组对象,比如图中的results,daily.

接下来看我们怎么获取对应的子数据:

try {
    JSONObject object = new JSONObject(json);       //获取整个url对象,需要try catch
    JSONArray array = object.getJSONArray("results");   //获取results数组对象
    for (int i = 0; i < array.length(); i++) {
        JSONObject jsonObject = array.getJSONObject(i);     //获取results下的所有对象
        JSONObject location = jsonObject.getJSONObject("location"); //获取location对象
        String id = location.getString("id");       //获取location下id的数据

        JSONArray daily = jsonObject.getJSONArray("daily"); //获取daily数组对象
        for (int j = 0; j < daily.length(); j++) {
            JSONObject dailys = daily.getJSONObject(j); //获取daily数组下的所有对象
            String  date = dailys.getString("date");    //获取daily下的date子项数据
        }
        Object last = jsonObject.get("last_update");    //它下面再没有数组或对象,可值得读值
        String last_update = last.toString();   //获取last_update数据
    }

} catch (JSONException e) {
    e.printStackTrace();
}
我是没有使用第三方库,因为这样可以更清楚的知道,JSONObject和JSONArray的区别,和什么时候改用哪个。

每天进步一点点!


猜你喜欢

转载自blog.csdn.net/qq_26446715/article/details/80049999