一. 簡介及資源
之前寫了一篇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的區別,和什麼時候改用哪個。
每天進步一點點!