Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示...
Android JSON原生解析的幾種思路,以號碼歸屬地,笑話大全,天氣預報為例演示
今天項目中要實現一個天氣的預覽,加載的信息很多,字段也很多,所以理清了一下思路,準備獨立出來寫一個總結,這樣對大家還是很有幫助的,老司機要開車了
涉及到網絡,你就一定要先添加權限,準沒錯
<!--網絡權限--> <uses-permission android:name="android.permission.INTERNET" />一.歸屬地查詢(JSONObject)
這個也是最簡單的一類Json了,我的博客
- Google官方網絡框架-Volley的使用解析Json以及加載網絡圖片方法
- Google官方網絡框架Volley實戰——QQ吉兇測試,南無阿彌陀佛!
里面不管是手機歸屬地查詢還是QQ吉兇,解析得到的Json都是最簡單的類型,我們這里以手機歸屬地為例來講述
這里的接口
http://apis.juhe.cn/mobile/get?phone=18679606764&key=22a6ba14995ce26dd0002216be51dabb這里說明一下,我們現在以及接下來的例子,都會用到Volley來解析接口得到Json,所以不會用Volley的話可以先去看一下上面的兩篇文章
- https://github.com/adamrocker/volley
Volley你到哪都能下載到,就不詳細說了
既然我們接口有了,我們就開始解析吧
/*** 解析接口*/private void Volley_Get() {String url = "http://apis.juhe.cn/mobile/get?phone=" + myPhone+ "&key=22a6ba14995ce26dd0002216be51dabb";RequestQueue queue = Volley.newRequestQueue(this);StringRequest request = new StringRequest(Method.PUBLIC, url,new Response.Listener<String>() {// 成功@Overridepublic void onResponse(String json) {Log.i("Json", json);}}, new Response.ErrorListener() {// 失敗@Overridepublic void onErrorResponse(VolleyError errorLog) {Log.e("Error", errorLog.toString());}});queue.add(request);}這樣,我們就解析得到了一串JSON,也就是今天本文中的主角
{"error_code": 0,"reason": "Return Successd!","result": {"areacode": "0796","card": "江西聯通GSM卡","city": "吉安","company": "中國聯通","province": "江西","zip": "343000"},"resultcode": "200" }我們可以看到,JSON是由一個大括號括起來的,里面是鍵值對,每一個鍵對應一個值,當然,他里面還有一個result的大括號包裹著一堆數據,這里我推薦一個工具叫
- HiJson(網上有下,自行搜索一下就可以了)
我們來看他的構造
這里看起來就十分的清晰了,我們一層層的剝下來,這里要用到的就是我們org.json下的JSONObject類
/*** 解析Json** @param json*/private void Volley_Json(String json) {try {JSONObject jsonObject = new JSONObject(json);JSONObject object = jsonObject.getJSONObject("result");tv_content.setText("歸屬地:" + object.getString("province") + "-"+ object.getString("city") + "\n" + "區號:" + object.getString("areacode")+ "\n" + "運營商:" + object.getString("company")+ "\n" + "用戶類型:" + object.getString("card"));} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}這里,我們可以看到,我們new一個JSONObject 并且把json穿進去解析,然后getJSONObject獲取一個json里面的字段,再去用getString(name)去獲取鍵得到值,所以運行結果
是不是沒什么難度?那我們來稍微做一個難一點的,笑話大全
二.笑話大全(JSONArray)
我們同樣的,需要一個接口
http://japi.juhe.cn/joke/content/list.from?key=56e5f85c150ebd54461ae4fb7c6705ec&page=1&pagesize=1&sort=asc&time=1418745237然后我們繼續用Volley來解析這個接口得到Json
/*** 解析接口*/private void Volley_Get() {String url = "http://japi.juhe.cn/joke/content/list.from?key=56e5f85c150ebd54461ae4fb7c6705ec&page=1&pagesize=1&sort=asc&time=1418745237";RequestQueue queue = Volley.newRequestQueue(this);StringRequest request = new StringRequest(Method.PUBLIC, url,new Response.Listener<String>() {// 成功@Overridepublic void onResponse(String json) {Log.i("Json", json);}}, new Response.ErrorListener() {// 失敗@Overridepublic void onErrorResponse(VolleyError errorLog) {Log.e("Error", errorLog.toString());}});queue.add(request);}這樣,我們得到的JSON就是
{"error_code": 0,"reason": "Success","result": {"data": [{"content": "大腦:別睡了快起來吧要遲到了。 身體:滾,別煩我我還要再躺會。 時間:你倆慢慢吵我先溜了。 尿:再不起我就出來了!","hashId": "0ee18f8733dc6744e6db6d0312839e5b","unixtime": 1462885431,"updatetime": "2016-05-10 21:03:51"}]} }我們需要的是中間的文字,但是這個json和之前那個json就有點不一樣了,這個明顯里面有一個數組,所以我們要用JSONArray數組來解析了,我們先來看一下結構
這個結構明顯要復雜一些,就在Data里面他里面還有一個數組,所以我們解析起來就要先遍歷一下了
/*** 解析Json** @param json*/private void Volley_Json(String json) {try {JSONObject jsonObject = new JSONObject(json);JSONObject jsonObject2 = jsonObject.getJSONObject("result");JSONArray ja = jsonObject2.getJSONArray("data");for (int i = 0; i < ja.length(); i++) {JSONObject jsonObject3 = (JSONObject) ja.get(i);tv_content.setText(jsonObject3.getString("content"));}} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}}我們可以看到,我們是一層一層的去解析的,首先是解析得到最外面的result,返回的是一個JSONObject ,然后繼續解析data,返回的是一個JSONArray,然后我們遍歷一下 JSONObject jsonObject3 = (JSONObject) ja.get(i);強轉成一個JSONObject ,解析到最后我們就可以直接getString(“content”)拿到數據了,是不是思路很清晰?我們看一下效果圖
三.天氣預報(JSONArray * 2)
這個也是比較復雜的,也是我項目中有用到的,就是一個JSON里面有數組,數組里面也有數組,這樣嵌套,其實說難也不難,只要掌握了思路,剩下的,只不過就是工作量的問題了
這里我們用到的接口是和風天氣的接口
- 官網:http://www.heweather.com/
接口
https://api.heweather.com/x3/weather?city=%E6%B7%B1%E5%9C%B3&key=你的key我們先用Volley解析接口
/*** 獲取天氣** @param city 城市名*/private void getWeather(String city) {String url = "https://api.heweather.com/x3/weather?city=" + city+ "&key=你的key";RequestQueue queue = Volley.newRequestQueue(this);StringRequest request = new StringRequest(Request.Method.GET, url,new Response.Listener<String>() {// 成功@Overridepublic void onResponse(String json) {Log.i("json", json);}}, new Response.ErrorListener() {// 失敗@Overridepublic void onErrorResponse(VolleyError errorLog) {Log.e("Error", errorLog.toString());}});queue.add(request);}這里,我們解析到了Json,有點長哦
{"HeWeather data service 3.0": [{"aqi": {"city": {"aqi": "60","co": "1","no2": "53","o3": "46","pm10": "65","pm25": "42","qlty": "良","so2": "7"}},"basic": {"city": "深圳","cnty": "中國","id": "CN101280601","lat": "22.544000","lon": "114.109000","update": {"loc": "2016-05-10 22:07","utc": "2016-05-10 14:07"}},"daily_forecast": [{"astro": {"sr": "05:45","ss": "18:54"},"cond": {"code_d": "301","code_n": "101","txt_d": "強陣雨","txt_n": "多云"},"date": "2016-05-10","hum": "70","pcpn": "25.4","pop": "98","pres": "1008","tmp": {"max": "32","min": "23"},"vis": "7","wind": {"deg": "216","dir": "無持續風向","sc": "微風","spd": "4"}},{"astro": {"sr": "05:44","ss": "18:54"},"cond": {"code_d": "101","code_n": "300","txt_d": "多云","txt_n": "陣雨"},"date": "2016-05-11","hum": "64","pcpn": "0.0","pop": "13","pres": "1008","tmp": {"max": "29","min": "23"},"vis": "10","wind": {"deg": "118","dir": "無持續風向","sc": "微風","spd": "10"}},{"astro": {"sr": "05:44","ss": "18:55"},"cond": {"code_d": "300","code_n": "101","txt_d": "陣雨","txt_n": "多云"},"date": "2016-05-12","hum": "68","pcpn": "0.1","pop": "7","pres": "1009","tmp": {"max": "29","min": "25"},"vis": "10","wind": {"deg": "129","dir": "無持續風向","sc": "微風","spd": "7"}},{"astro": {"sr": "05:44","ss": "18:55"},"cond": {"code_d": "101","code_n": "302","txt_d": "多云","txt_n": "雷陣雨"},"date": "2016-05-13","hum": "69","pcpn": "9.8","pop": "53","pres": "1011","tmp": {"max": "29","min": "23"},"vis": "7","wind": {"deg": "123","dir": "無持續風向","sc": "微風","spd": "1"}},{"astro": {"sr": "05:43","ss": "18:56"},"cond": {"code_d": "302","code_n": "302","txt_d": "雷陣雨","txt_n": "雷陣雨"},"date": "2016-05-14","hum": "73","pcpn": "5.3","pop": "66","pres": "1011","tmp": {"max": "29","min": "23"},"vis": "10","wind": {"deg": "115","dir": "無持續風向","sc": "微風","spd": "10"}},{"astro": {"sr": "05:43","ss": "18:56"},"cond": {"code_d": "302","code_n": "302","txt_d": "雷陣雨","txt_n": "雷陣雨"},"date": "2016-05-15","hum": "69","pcpn": "7.7","pop": "58","pres": "1009","tmp": {"max": "29","min": "22"},"vis": "10","wind": {"deg": "166","dir": "無持續風向","sc": "微風","spd": "4"}},{"astro": {"sr": "05:42","ss": "18:57"},"cond": {"code_d": "302","code_n": "101","txt_d": "雷陣雨","txt_n": "多云"},"date": "2016-05-16","hum": "67","pcpn": "1.8","pop": "50","pres": "1008","tmp": {"max": "28","min": "23"},"vis": "10","wind": {"deg": "10","dir": "無持續風向","sc": "微風","spd": "8"}}],"hourly_forecast": [{"date": "2016-05-10 22:00","hum": "89","pop": "38","pres": "1009","tmp": "27","wind": {"deg": "80","dir": "東風","sc": "微風","spd": "4"}}],"now": {"cond": {"code": "101","txt": "多云"},"fl": "28","hum": "88","pcpn": "0","pres": "1008","tmp": "25","vis": "10","wind": {"deg": "10","dir": "南風","sc": "3-4","spd": "14"}},"status": "ok","suggestion": {"comf": {"brf": "較不舒適","txt": "白天天氣多云,同時會感到有些熱,不很舒適。"},"cw": {"brf": "不宜","txt": "不宜洗車,路面積水較多,不宜擦洗汽車。如果執意擦洗,要做好濺上泥水的心理準備。"},"drsg": {"brf": "熱","txt": "天氣熱,建議著短裙、短褲、短薄外套、T恤等夏季服裝。"},"flu": {"brf": "少發","txt": "各項氣象條件適宜,無明顯降溫過程,發生感冒機率較低。"},"sport": {"brf": "較適宜","txt": "天氣較好,戶外運動請注意防曬,推薦您在室內進行低強度運動。"},"trav": {"brf": "適宜","txt": "天氣較好,但絲毫不會影響您出行的心情。溫度適宜又有微風相伴,適宜旅游。"},"uv": {"brf": "弱","txt": "紫外線強度較弱,建議出門前涂擦SPF在12-15之間、PA+的防曬護膚品。"}}}] }這里,我們可以根據結構圖來分析
這里我們可以看到,他本身就是一個數組,接著又是一個數組,數組里面包含著接下來七天的天氣情況,這里呢,我們就不做的特別詳細了,我們寫三天 ,怎么寫呢?看著哈
/*** 解析Json** @param json*/private void Volley_Json(String json) {try {JSONObject jsonObject = new JSONObject(json);JSONArray jArray = jsonObject.getJSONArray("HeWeather data service 3.0");for (int i = 0; i < jArray.length(); i++) {JSONObject jb1 = (JSONObject) jArray.get(i);JSONArray jr1 = jb1.getJSONArray("daily_forecast");for (int j = 0; j < jr1.length(); j++) {JSONObject jb2 = (JSONObject) jr1.get(j);JSONObject jb3 = jb2.getJSONObject("tmp");dateList.add(jb2.getString("date"));weatherList.add(jb2.getJSONObject("cond").getString("txt_n"));TmpList.add(jb3.getString("min") + "-"+ jb3.getString("max"));}}// 設置參數today_date.setText(dateList.get(0));today_weather.setText(weatherList.get(0));today_tmp.setText(TmpList.get(0));tomorrow_date.setText(dateList.get(1));tomorrow_weather.setText(weatherList.get(1));tomorrow_tmp.setText(TmpList.get(1));after_date.setText(dateList.get(2));after_weather.setText(weatherList.get(2));after_tmp.setText(TmpList.get(2));//設置圖片if (weatherList.get(0).equals("晴")) {today_img.setImageResource(R.mipmap.sun);} else if (weatherList.get(0).equals("多云")) {today_img.setImageResource(R.mipmap.cloudy);} else {today_img.setImageResource(R.mipmap.rain);}if (weatherList.get(1).equals("晴")) {tomorrow_img.setImageResource(R.mipmap.sun);} else if (weatherList.get(1).equals("多云")) {tomorrow_img.setImageResource(R.mipmap.cloudy);} else {tomorrow_img.setImageResource(R.mipmap.rain);}if (weatherList.get(2).equals("晴")) {arter_img.setImageResource(R.mipmap.sun);} else if (weatherList.get(2).equals("多云")) {arter_img.setImageResource(R.mipmap.cloudy);} else {arter_img.setImageResource(R.mipmap.rain);}} catch (JSONException e) {e.printStackTrace();}//清空數據dateList.clear();weatherList.clear();TmpList.clear();}這里代碼雖然多,但是后半部分基本上可以不看,就是設置數據和圖片的,我們這里同樣的getJSONArray獲取到整個數組,然后開始遍歷這個數組,強轉為JSONObject 之后我們再次的獲取每天的小數組daily_forecast,到這里,就和上面一樣了,我們又強轉為JSONObject 就可以開始getString(name)了,但是我們這里要獲取三天的數據,所以我用一個List裝起來,然后拿出來設置到TextView上,然后再根據天氣設置圖片,最后,清空一下List,因為他每次請求我們都是只獲取他的前三天數據,所以運行的結果就是這樣:
是不是這篇博客挺實用的,如果覺得好的話,可以點個贊喲,謝謝大家了
Demo下載:http://download.csdn.net/detail/qq_26787115/9516126
我的群,通往Android的神奇之旅 :555974449,歡迎大家進來交流技術!
總結
以上是生活随笔為你收集整理的Android JSON原生解析的几种思路,以号码归属地,笑话大全,天气预报为例演示...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OC之非ARC环境下循环retain问题
- 下一篇: 数据库(连接)