android之客户端与webservice的json方式交互
数据传输量
 同等的数据,Json需要传输的数据更少,xml会相对多些,对关注数据量的机器来说,这点比较关键。
扩展性,
 虽然xml打着可扩展的名号,但是还没有xml可以扩展,json不可以扩展的。
编码难度
 xml跨平台对接更容易出问题,虽然工具很多,但是想在跨平台轻易的调通就不是很容易,而json手工就能写出来,编码就简单很多。
解码难度
 这个我觉的json问题很大,特殊字符的处理让人很费心。xml,比如soap,一般不会有这个问题,只要考虑如何编码就可以了,很罕见遇到因为特殊字符导致无法解析的情况。
那个更主流
 JSON,虽然解码有时会遇到问题,但是看起来更简洁和容易调试。
另外推荐一个google的 protobuf,这个才是效率的王者,参考这里,google的很多服务都是用这个,包括google market.
 json是轻量级的,它易于使用,并且容易转换到Java对象;并且客户端脚本js容易获取,Android已经支持JSON的标准库。
 xml一般用在数据量很大的情况下或者数据结构复杂的时候一般用xml
 
json:
21世纪初,Douglas Crockford寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是XML,但是Douglas Crockford觉得XML的生成和解析都太麻烦,所以他提出了一种简化格式,也就是Json。
Json的规格非常简单,只用一个页面几百个字就能说清楚,而且Douglas Crockford声称这个规格永远不必升级,因为该规定的都规定了。
1) 并列的数据之间用逗号(",")分隔。
2) 映射用冒号(":")表示。
3) 并列数据的集合(数组)用方括号("[]")表示。
4) 映射的集合(对象)用大括号("{}")表示。
上面四条规则,就是Json格式的所有内容。
比如,下面这句话:
"北京市的面积为16800平方公里,常住人口1600万人。上海市的面积为6400平方公里,常住人口1800万。"
写成json格式就是这样:
[
{"城市":"北京","面积":16800,"人口":1600},
{"城市":"上海","面积":6400,"人口":1800}
]
如果事先知道数据的结构,上面的写法还可以进一步简化:
[
["北京",16800,1600],
["上海",6400,1800]
]
java 定义示例:
private String jsonData1="[{\"name\":\"renhaili\",\"age\":20},{\"name\":\"zhouxiaodong\",\"age\":21}]";
private String jsonData2="{\"name\":\"xiong\",\"age\":18}";
由此可以看到,json非常易学易用。所以,在短短几年中,它就取代xml,成为了互联网上最受欢迎的数据交换格式。
 
 
 
 
第一种方便简单:
 
最近在用Android调用Web服务,开始准备用WebService来调用,用jws的WebService方式写好后发现Android调用的时候很多问题不知道咋解决了,后来发现有一个更好的办法,就是采用HttpPost来与后台交互。
下面就说一下相关的JSON的操作:
不得不说,JSON 格式的确是非常美妙的,速度快而且简化了很多操作
 在 Android 下,Android SDK 已经为我们封装好了整个与 JSON 有关的操作,使用非常方便
 
 以下就是一个标准的 JSON 请求的实现过程:
 
 HttpPost request = new HttpPost(url);
 // 先封装一个 JSON 对象
 JSONObject param = new JSONObject();
 param.put("name", "rarnu");
 param.put("password", "123456");
 // 绑定到请求 Entry
 StringEntity se = new StringEntity(param.toString()); 
 request.setEntity(se);
 // 发送请求
 HttpResponse httpResponse = new DefaultHttpClient().execute(request);
 // 得到应答的字符串,这也是一个 JSON 格式保存的数据
 String retSrc = EntityUtils.toString(httpResponse.getEntity());
 // 生成 JSON 对象
 JSONObject result = new JSONObject( retSrc);
 String token = result.get("token");
 
 
 
 
第二种传统型的:
 
 
package com.practice.json;
 
 import org.json.JSONArray;
 import org.json.JSONException;
 import org.json.JSONObject;
 
 import android.app.Activity;
 import android.os.Bundle;
 import android.util.Log;
 
 public class JsonDemo extends Activity {
     /*
      * 解析JSON的例子,str保存的是JSON代码,解析后的数据在LogCat里输出 
     */
     
     String TAG = "Json message";
     
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.main);
         detectJSON();
     }
     
     private void detectJSON() {
         String str = "{"+
         
           "\"日期\" : \"2011-06-06\","+
 
           //Like 是 JSONObject
           "\"Like\" : {"+
             "\"Name\" : \"加内特\","+
             "\"Height\" : \"2.11cm\","+ 
             "\"Age\" : 35"+
           "},"+
         
           //LikeList 就是一个 JSONObject
           "\"LikeList\":" +
               "{\"List\": " +
               "["+
                     //这里也是JSONObject
                   "{"+
                     "\"Name\" : \"Rose\","+
                     "\"Height\" : \"190cm\","+ 
                     "\"Age\" : 23"+
                   "},"+
                   //这里也是JSONObject
                   "{"+
                     "\"Name\" : \"科比\","+
                     "\"Height\" : \"198cm\","+ 
                     "\"Age\" : 33"+
                   "}"+
               "]"+
               "}"+
           "}";
         
         try {
             JSONObject dataJson = new JSONObject(str);
             Log.d(TAG, dataJson.getString("日期"));
             
             JSONObject nbaJson = dataJson.getJSONObject("Like");
         
             Log.d(TAG, nbaJson.getString("Name"));
             Log.d(TAG, nbaJson.getString("Height"));
             Log.d(TAG, nbaJson.get("Age").toString());
             
             JSONObject listJson = dataJson.getJSONObject("LikeList");
             JSONArray arrayJson = listJson.getJSONArray("List");
             
             for(int i=0;i<arrayJson.length();i++) {
                 
                 JSONObject tempJson = arrayJson.optJSONObject(i);
                 
                 Log.d(TAG, tempJson.getString("Name"));
                 Log.d(TAG, tempJson.getString("Height"));
                 Log.d(TAG, tempJson.getString("Age").toString());    
             }
             
             
         } catch (JSONException e) {
             System.out.println("Something wrong...");
             e.printStackTrace();
         }
     }
 }
 
 
 
                    
                     
                    
                 
                    
                
 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号