使用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的區別,和什麼時候改用哪個。

每天進步一點點!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章