首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

android之客户端与webservice的json模式交互

2013-04-12 
android之客户端与webservice的json方式交互数据传输量同等的数据,Json需要传输的数据更少,xml会相对多些,

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
在Android开发中有一项非常广泛的应用:Android项目获取另一个web项目的资源或者返回的数据。 本文获取web项目返回的JSON数据。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();
        }
    }
}


热点排行