android之客户端与webservice的json方式交互
数据传输量
同等的数据,Json需要传输的数据更少,xml会相对多些,对关注数据量的机器来说,这点比较关键。
扩展性,
虽然xml打着可扩展的名号,但是还没有xml可以扩展,json不可以扩展的。
编码难度
xml跨平台对接更容易出问题,虽然工具很多,但是想在跨平台轻易的调通就不是很容易,而json手工就能写出来,编码就简单很多。
解码难度
这个我觉的json问题很大,特殊字符的处理让人很费心。xml,比如soap,一般不会有这个问题,只要考虑如何编码就可以了,很罕见遇到因为特殊字符导致无法解析的情况。
那个更主流
JSON,虽然解码有时会遇到问题,但是看起来更简洁和容易调试。
另外推荐一个google的 protobuf,这个才是效率的王者,参考这里,google的很多服务都是用这个,包括google market.
json是轻量级的,它易于使用,并且容易转换到Java对象;并且客户端脚本js容易获取,Android已经支持JSON的标准库。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();
}
}
}