2013年7月20日 星期六

Json解析詳解


  一種輕量級的數據交換格式,具有良好的可讀和便於快速編寫的特性。業內主流技術為其提供了完整的解決方案(有點類似於正則表達式,獲得了當今大部分語言的支持),從而可以在不同平台間進行數據交換。JSON採用兼容性很高的文本格式,同時也具備類似於C語言體系的行為。– Json.org
JSON Vs XML
1.JSON和XML的數據可讀性基本相同
2.JSON和XML同樣擁有豐富的解析手段
3.JSON相對於XML來講,數據的體積小
4.JSON與JavaScript的交互更加方便
5.JSON對數據的描述性比XML較差

6.JSON的速度要遠遠快於XML

android2.3提供的json解析類
android的json解析部分都在包org.json下,主要有以下幾個類: 
JSONObject:可以看作是一個json對象,這是系統中有關JSON定義的基本單元,其包含一對兒(Key/Value)數值。它對外部(External:應用toString()方法輸出的數值)調用的響應體現為一個標準的字符串(例如:{"JSON": "Hello, World"},最外被大括號包裹,其中的Key和Value被冒號":"分隔)。其對於內部(Internal)行為的操作格式略微,例如:初始化一個JSONObject實例,引用內部的put()方法添加數值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之間是以逗號","分隔。Value
的類型包括:
Boolean JSONArray JSONObject Number String 或者默認值JSONObject.NULL object 。
JSONStringer:json文本構建類,根據官方的解釋,這個類可以幫助快速和便捷的創建JSON text。其最大的優點在於可以減少由於格式的錯誤導致程序異常,引用這個類可以自動嚴格按照JSON語法規則(syntax rules)創建JSON text。每個JSONStringer實體只能對應創建一個JSON text。。其最大的優點在於可以減少由於格式的錯誤導致程序異常,引用這個類可以自動嚴格按照JSON語法規則(syntax rules)創建JSON text。每個JSONStringer實體只能對應創建一個JSON text。
JSONArray它代表一組有序的數值。將其轉換為String輸出(toString)所表現的形式是用方括號包裹,數值以逗號”,”分隔(例如: [value1,value2,value3],大家可以親自利用簡短的代碼更加直觀的了解其格式)。這個類的內部同樣具有查詢行為, get()和opt()兩種方法都可以通過index索引返回指定的數值,put()方法用來添加或者替換數值。同樣這個類的value類型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默認值JSONObject.NULL object。
JSONTokener:json解析類JSONException:json中用到的異常

JSONObject, JSONArray來構建json文本

  1. package  com.jun.json;  
  2.   
  3. import  java.io.IOException;  
  4. import  java.io.InputStream;  
  5. import  java.io.UnsupportedEncodingException;  
  6. import  java.net.HttpURLConnection;  
  7. import  java.net.URL;  
  8.   
  9. import  org.apache.http.HttpResponse;  
  10. import  org.apache.http.HttpStatus;  
  11. import  org.apache.http.client.ClientProtocolException;  
  12. import  org.apache.http.client.HttpClient;  
  13. import  org.apache.http.client.methods.HttpGet;  
  14. import  org.apache.http.impl.client.DefaultHttpClient;  
  15. import  org.apache.http.util.EntityUtils;  
  16. import  org.json.JSONArray;  
  17. import  org.json.JSONException;  
  18. import  org.json.JSONObject;  
  19. import  org.json.JSONTokener;  
  20.   
  21. import  android.os.Bundle;  
  22. import  android.app.Activity;  
  23. import  android.view.Menu;  
  24. import  android.widget.TextView;  
  25.   
  26. public  class  JsonActivity  extends  Activity {  
  27.   
  28.       
  29.     TextView tvJson= null ;  
  30.     @Override  
  31.     public  void  onCreate(Bundle savedInstanceState) {  
  32.         super .onCreate(savedInstanceState);  
  33.         setContentView(R.layout.activity_json);  
  34.           
  35.         tvJson=(TextView) findViewById(R.id.showTxt);  
  36.     String str=connServerForResult( "http://bcs.duapp.com/weimeipicture/initial.txt" );  
  37.     tvJson.setText(str);  
  38.                //獲得多個Singer     
  39.         parseJsonMulti(str);     
  40.           
  41.     }  
  42.   //解析多個數據的Json    
  43.     private  void  parseJsonMulti(String strResult) {     
  44.           
  45.           String sb = "" ;   
  46.         try  {    
  47.               
  48. // JSONObject jsonObject=new JSONObject();  
  49. // jsonObject.optJSONObject(strResult);  
  50. // System.out.println("Jsons parse error 1");    
  51. // JSONArray jsonObjs =jsonObject.getJSONArray("messages");    
  52.               
  53.               
  54.              
  55.              JSONTokener jsonParser =  new  JSONTokener(strResult);  
  56.             JSONObject jsonObject = (JSONObject) jsonParser.nextValue();  
  57.              JSONArray jsonObjs =jsonObject.getJSONArray( "messages" );    
  58.               
  59.             for int  i =  ; i < jsonObjs.length() ; i++){     
  60.                 JSONObject jsonObj = ((JSONObject)jsonObjs.opt(i)) ;    
  61.                   
  62.                 System.out.println( "Jsons parse error 0" +i);    
  63.             
  64.                   
  65.                   
  66.                 int  id = jsonObj.getInt( "id" );     
  67.                 String name = jsonObj.getString( "name" );     
  68.                 String gender = jsonObj.getString( "gender" );    
  69.                   
  70.               sb+=  "ID號" +id +  ",姓名:"  + name +  ",性別:"  + gender+  "\n"  ;   
  71.                 
  72.                 
  73.                 System.out.println(sb);     
  74.                   
  75.                   
  76.                   
  77.             }     
  78.             tvJson.setText(sb);     
  79.         }  catch  (JSONException e) {     
  80.             System.out.println( "Jsons parse error !!!!" );     
  81.             e.printStackTrace();     
  82.         }     
  83.     }     
  84.       
  85.   //獲取json文本  
  86.     private  String connServerForResult(String strUrl) {     
  87.         // HttpGet對象     
  88.         HttpGet httpRequest =  new  HttpGet(strUrl);     
  89.         String strResult =  "" ;     
  90.         try  {     
  91.             // HttpClient對象     
  92.             HttpClient httpClient =  new  DefaultHttpClient();     
  93.             // 獲得HttpResponse對象     
  94.             HttpResponse httpResponse = httpClient.execute(httpRequest);     
  95.             if  (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {     
  96.                 // 取得返回的數據     
  97.                 strResult = EntityUtils.toString(httpResponse.getEntity());     
  98.               // str=new String(str.getBytes("8859_1"),"GB2312");   
  99.                 //tvJson.setText();    
  100.                   
  101.                   
  102.                   
  103.                 }     
  104.         }  catch  (ClientProtocolException e) {     
  105.             tvJson.setText( "protocol error" );     
  106.             e.printStackTrace();     
  107.         }  catch  (IOException e) {     
  108.             tvJson.setText( "IO error" );     
  109.             e.printStackTrace();     
  110.         }     
  111.           
  112.         try  {  
  113.             strResult= new   String(strResult.getBytes( "8859_1" ), "GB2312" );  
  114.         }  catch  (UnsupportedEncodingException e) {  
  115.             // TODO Auto-generated catch block  
  116.             e.printStackTrace();  
  117.         }  
  118.           
  119.         return  strResult;     
  120.     }     
  121.   
  122.     @Override  
  123.     public  boolean  onCreateOptionsMenu(Menu menu) {  
  124.         getMenuInflater().inflate(R.menu.activity_json, menu);  
  125.         return  true ;  
  126.     }  
  127. }  

服務器上面的json數據:
{"messages":[ 
        {"id":"02","name":"tom","gender":"男"}, 
         {"id":"03","name":"jerry"," gender":"男"}, 
{"id":"04","name":"jim","gender":"男"}, 
{"id":"05","name":"lily" ,"gender":"女"}]}

一定要注意數據格式,稍有不對就會解析不出來!

沒有留言:

張貼留言