標籤:
前言:好一段時間沒寫部落格了,說最近挺忙的,感覺像是個借口,每天還是同樣的24個小時,每天還是同樣的5:30就準時下班,每天晚上還是有大量的空餘時間...最直接的原因就是,最近墮落了。腦子裡也時常會有很多想法浮現,都是些比較實際的想法,但往往就是浮現那一下,心情激動了一下,心裡默默告訴自己,有時間就要這麼做...好多想法都被一些其它的誘惑給磨滅掉了,要麼是打球、要麼是看電影、要麼是處理一些亂七八糟的事去了。總之,近段時間,花在技術上的時間很少很少,好好反思下。
前段時間,來了一位新疆的客戶,提出了一個需求,需求不難實現,只是客戶很趕時間,希望在兩天內搞出來,想想當時還是年輕氣盛,沒多想,就答應下來了。其中有一個環節需要與客戶的後台進行對接,後台介面返回的資料類型為json,很簡單的資料結構,沒有嵌很多層。但由於自己之前與背景對接用的一直都是webservice,突然出來個json,一下子有點蒙了。不過對於json這麼常用的資料結構,都沒有把握其解析方法,自己也是該好好反思。剛遇到這問題時,想著問題搞完了一定要寫一篇部落格來好好記錄下json的解析方法,以便後期的項目用到時,可以快速上手。但項目過去好一段時間了,部落格一直推到了今天才開始寫,其中的原因就像開篇說的...
JSON定義:一種輕量級的資料交換格式,具有良好的可讀和快速編寫特性,業內主流技術為其提供了完整的解決方案,從而可以在不同平台間進行資料互動。
JSON解析:在講解JSON解析方法前,先來瞭解兩個基本概念:
1.JSONObject:一個基本的json對象,有關json定義的基本單元,說白了,其實就是一堆索引值對(key/value),對外體現為一個標準的字串,如:{"name":"dean"}.最外被大括弧包裹,內部的key和value之間用:分隔,value的類型包括:Boolean,JSONArray,JSONObject,Number,String,JSONObject.NULL object.
2.JSONArray:它代表一組有序的數值,對外的表現形式為:最外層用方括弧包裹,數值以逗號,分隔,如:[value1,value2,value3]
JSON總共有四種資料格式:a.直接對象 b.數組 c.對象裡麵包含數組 d.數組裡麵包含數組 其實解析原理都一樣,遇到object就可以直接調用object.getString()方法擷取value,遇到array就逐個轉換為object,再調用object.getString()方法擷取value. 下面以代碼形式展示具體如何解析JSON:
//JSON對象直接解析 btnObjectPaser.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { //JSON字串 String json="{\"username\":\"dean\",\"age\":23,\"addr\":\"廣東省廣州市天河區\"}"; //根據JSON字串 獲得JSON object對象 JSONObject jsonObject =new JSONObject(json); //根據key 擷取相應的value String str="名字:"+jsonObject.getString("username")+" 年齡:"+jsonObject.getString("age")+" 住址:"+jsonObject.getString("addr")+"\n"; tvShowResult.setText(str); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); //JSON數組直接解析 btnArrayPaser.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { //JSON字串 String json="[{\"username\":\"dean\",\"age\":\"23\",\"addr\":\"廣東省廣州市天河區\"}," + "{\"username\":\"小張\",\"age\":\"32\",\"addr\":\"廣東省廣州市白雲區\"}]"; String str = ""; //根據JSON字串 獲得JSON數組 JSONArray jsonArray =new JSONArray(json); for(int i=0;i<jsonArray.length();i++){ JSONObject jsonObject = (JSONObject)jsonArray.opt(i);//將JSON數組通過opt()函數轉換為JSONObject //根據key 擷取相應的value str +="名字:"+jsonObject.getString("username")+" 年齡:"+jsonObject.getString("age")+" 住址:"+jsonObject.getString("addr")+"\n"; } tvShowResult.setText(str); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); //JSON對象裡有數組 btnArrayInObject.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { //JSON字串 String json= "{\"username\":\"張木生\",age:11,\"jicheng\":[{\"zhengshu\":\"PMP\",\"date\":\"2011年\"}," + "{\"zhengshu\":\"資訊系統專案管理師\",\"date\":\"2012年\"}],\"addr\":\"江西\"}"; String str = ""; //根據JSON字串 獲得JSON對象 JSONObject jsonObject =new JSONObject(json); str +="名字:"+jsonObject.getString("username")+" 年齡:"+jsonObject.getString("age"); JSONArray jsonArray = new JSONArray(jsonObject.getString("jicheng")); for(int i=0;i<jsonArray.length();i++){ JSONObject jsonObject2 = (JSONObject)jsonArray.opt(i);//將JSON數組通過opt()函數轉換為JSONObject //根據key 擷取相應的value str +="認證:"+jsonObject2.getString("zhengshu")+" 日期:"+jsonObject2.getString("date")+";"; } str +="地址:"+jsonObject.getString("addr"); tvShowResult.setText(str); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); //JSON數組裡有數組 btnArrayInArray.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { //JSON字串 String json="["+ "{\"devid\":\"1234567800\",\"gps\":[{\"time\":\"2014-11-12\",\"latitude\":\"29.4963\",\"longitude\":\"116.189\"},{\"time\":\"2014-11-12\",\"latitude\":\"29.4963\",\"longitude\":\"116.189\" }],\"devname\":\"贛01\"},"+ " {\"devid\":\"1234567800\",\"gps\":[{\"time\":\"2014-11-12\",\"latitude\":\"29.4963\",\"longitude\":\"116.189\"},{\"time\":\"2014-11-12\",\"latitude\":\"29.4963\",\"longitude\":\"116.189\" }],\"devname\":\"贛92\"},"+ " {\"devid\":\"1234567800\",\"gps\":[{\"time\":\"2014-11-12\",\"latitude\":\"29.4963\",\"longitude\":\"116.189\"},{\"time\":\"2014-11-12\",\"latitude\":\"29.4963\",\"longitude\":\"116.189\" }],\"devname\":\"贛43\"}"+ "]"; String str = ""; //根據JSON字串 獲得JSON數組 JSONArray jsonArray = new JSONArray(json); for(int i=0;i<jsonArray.length();i++){ JSONObject jsonObject = (JSONObject)jsonArray.opt(i);//將JSON數組通過opt()函數轉換為JSONObject //根據key 擷取相應的value str +="ID:"+jsonObject.getString("devid")+","; //擷取第二層數組 JSONArray jsonArray2 = new JSONArray(jsonObject.getString("gps"));// JSONArray jsonArray2 = jsonObject.getJSONArray("gps");//也可以這樣獲得第二層數組 for(int j=0;j<jsonArray2.length();j++){ JSONObject jsonObject2 = (JSONObject)jsonArray2.opt(j); str +=" GPS時間:"+jsonObject2.getString("time")+" GPS經度:"+jsonObject2.getString("latitude")+" GPS維度:"+jsonObject2.getString("longitude")+";"; } str +=" 裝置名稱:"+jsonObject.getString("devname")+"."; } tvShowResult.setText(str); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } });
核心技術篇:6.android網路編程之json解析