JSON解析详解

JSON解析详解


[java]  view plain copy
  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.             
  37.             
  38.           jsonOper();  
  39.            
  40.               
  41.       }    
  42.     private void jsonOper() {  
  43.     // TODO Auto-generated method stub  
  44.       String str=connServerForResult("http://bcs.duapp.com/weimeipicture/tes.txt");    
  45.           
  46.           
  47.         parseJsonMulti(str);   
  48. }  
  49. /解析多个数据的Json      
  50.       private void parseJsonMulti(String strResult) {       
  51.               
  52.             String sb ="";     
  53.           try {      
  54.                   
  55.   //           JSONObject jsonObject=new JSONObject();    
  56.   //           jsonObject.optJSONObject(strResult);    
  57.   //           System.out.println("Jsons parse error 1");      
  58.   //            JSONArray jsonObjs =jsonObject.getJSONArray("messages");      
  59.                   
  60.                   
  61.                  
  62.                JSONTokener jsonParser = new JSONTokener(strResult);    
  63.               JSONObject jsonObject = (JSONObject) jsonParser.nextValue();    
  64.                JSONArray jsonObjs =jsonObject.getJSONArray("messages");      
  65.                   
  66.               for(int i = 0; i < jsonObjs.length() ; i++){       
  67.                   JSONObject jsonObj = ((JSONObject)jsonObjs.opt(i)) ;      
  68.                       
  69.                   System.out.println("Jsons parse error 0"+i);      
  70.                 
  71.                       
  72.                       
  73.                   String msg = jsonObj.getString("msg");       
  74.                    
  75.                       
  76.                 sb+= "msg:::"+msg + "\n";  
  77.                     
  78.                     
  79.                   System.out.println(sb);       
  80.                       
  81.                       
  82.                       
  83.               }       
  84.               tvJson.setText(sb);       
  85.           } catch (JSONException e) {       
  86.               System.out.println("Jsons parse error !!!!");       
  87.               e.printStackTrace();       
  88.           }       
  89.       }       
  90.           
  91.     //获取json文本    
  92.       private String connServerForResult(String strUrl) {       
  93.           // HttpGet对象       
  94.           HttpGet httpRequest = new HttpGet(strUrl);       
  95.           String strResult = "";       
  96.           try {       
  97.               // HttpClient对象       
  98.               HttpClient httpClient = new DefaultHttpClient();       
  99.               // 获得HttpResponse对象       
  100.               HttpResponse httpResponse = httpClient.execute(httpRequest);       
  101.               if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {       
  102.                   // 取得返回的数据       
  103.                   strResult = EntityUtils.toString(httpResponse.getEntity());       
  104.                 //  str=new  String(str.getBytes("8859_1"),"GB2312");     
  105.                   //tvJson.setText();      
  106.                       
  107.                       
  108.                       
  109.                   }       
  110.           } catch (ClientProtocolException e) {       
  111.               tvJson.setText("protocol error");       
  112.               e.printStackTrace();       
  113.           } catch (IOException e) {       
  114.               tvJson.setText("IO error");       
  115.               e.printStackTrace();       
  116.           }       
  117.               
  118.           try {    
  119.               strResult=new  String(strResult.getBytes("8859_1"),"GB2312");    
  120.           } catch (UnsupportedEncodingException e) {    
  121.               // TODO Auto-generated catch block    
  122.               e.printStackTrace();    
  123.           }    
  124.               
  125.           return strResult;       
  126.       }       
  127.       
  128.       @Override    
  129.       public boolean onCreateOptionsMenu(Menu menu) {    
  130.           getMenuInflater().inflate(R.menu.activity_json, menu);    
  131.           return true;    
  132.       }    
  133.   }    

注意:JAVA在网络传输中使用的编码是"ISO-8859-1",故在输出时需要进行转化,即: tvJson.setText(new  String(strResult.getBytes("8859_1"),"GB2312")); 

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文本


[java]  view plain copy
  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 = 0; 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":"女"}]}


一定要注意数据格式,稍有不对就会解析不出来!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值