Android中如何使用JSON来实现客户端和服务器的交互
首先来了解一下JSON:
JSON的定义:一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。
Json.orgJSON的结构:Name/Value Pairs,类似所熟知的Keyed list、 Hash table、Disctionary和Associative array。在Andro优,文-论'文:网http://www.youerw.com id平台中同时存在另外一个类 “Bundle“,某种程度上具有相似的行为。org.json.JSONObjectArray,一组有序的数据列表。
系统中有关JSON定义的基本单元:org.json.JSONArray在Android中包含四个与JSON相关的类和一个Exceptions:JSONObject、JSONArray、JSONStringer、JSONTokener、JSONException。
JSONObject:其包含一对儿(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。有两个不同的取值方法:get(): 在确定数值存在的条件下使用,否则当无法检索到相关Key时,将会抛出一个Exception信息。opt(): 这个方法相对比较灵活,当无法获取所指定数值时,将会返回一个默认数值,并不会抛出异常。
JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为,get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。
JSONStringer:根据官方的解释,这个类可以帮助快速和便捷的创建JSONtext。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntaxrules)创建JSONtext。每个JSONStringer实体只能对应创建一个JSONtext。
根据下边的实例来了解其它相关信息:
1.String myString = new JSONStringer().object()
2. .key(“AR”).value(“www.Androidres.com!”)
3. .endObject()4..toString();
结果是一组标准格式的JSONtext:{”AR”:”www.Androidres.com!”}其中的.object()和.endObject()必须同时使用,是为了按照Object标准给数值添加边界。同样,针对数组也有一组标准的方法来生成边界.array()和.endArray()。
JSONTokener:这个是系统为JSONObject和JSONArray构造器解析JSONsource string的类,它可以从source string中提取数值信息。
JSONException:是JSON.org类抛出的异常信息。
因为JSON的结构良好,构造JSONObject和JSONArray都是非常的简单,而且使用起来又跟Map非常的相近,不过最好的还是可嵌套性与结构良好性的统一,使得在使用JSON编程的时,感觉很舒服。但是如果字符串太长的话,使用JSONArray(String str)来构造JSONArray对象还是比较耗时的,譬如使用BASE 64编码后的图像使用JSON进行传输会相对比较慢。
然后我们来看看如何使用JSON实现客户端和服务器端的交互:
第一步 服务器端优,文-论'文:网http://www.youerw.com 的搭建
如果远程服务器使用了json而不是xml的数据提供,在Android平台上已经内置的org.json包可以很方便的实现手机客户端的解析处理。所以在服务器端,我采用的是SSH框架,struts 2集合了JSON插件,服务器和客户端的信息交互采用的JSON来传输,由于在服务器端用了Struts 2,所以要装一个JSON插件。这样,很轻易的就把服务器端的信息用JSON的形式发送到了手机端。
以下是代码:
在服务器端搭建好SSH框架,具体细节就不在赘述了。
struts.xml配置如下:
1.<packagename= "login" extends = "json-default" >
2.<actionname= "login" class = "com.jclick.test.LoginAction" method= "login" >
3.<resulttype= "json" ><paramname= "includeProperties" >result</param></result>
4.</action>
5.</ package >
6.
7.<packagename= "login" extends = "json-default" >
8.<actionname= "login" class = "com.jclick.test.LoginAction" method= "login" >
9.<resulttype= "json" ><paramname= "includeProperties" >result</param></result>
10.</action>
11.</ package >
第二歩 手机端的代码实现
首先,手机端有一个缓存类,主要用于缓存一些手机端需要访问的数据,这样的好处是可以达达节省手机和服务器的交互,用单例实现的:
1.packagecom.jclick.cache;
2.
3.importcom.jclick.bean.User;
4.
5.publicclassCache{
6.
7.privateUserUser;
8.
9.privateCache(){
10.
11.}
12./**构造单例*/
13.privatestaticclassCacheHolder{
14.privatestaticfinalCacheINSTANCE=newCache();
15.}
16.publicCachegetInstance(){
17.returnCacheHolder.INSTANCE;
18.}
19.publicUsergetUser(){
20.returnUser;
21.}
22.publicvoidsetUser(UserUser){
23.this .User=User;
24.}
25.
26.}
27.
28.packagecom.jclick.cache;
29.
30.importcom.jclick.bean.User;
31.
32.publicclassCache{
33.
34. privateUserUser;
35.
36. privateCache(){
37.
38. }
优,文-论'文:网http://www.youerw.com 39. /**构造单例*/
40. privatestaticclassCacheHolder{
41. privatestaticfinalCacheINSTANCE=newCache();
42. }
43. publicCachegetInstance(){
44. returnCacheHolder.INSTANCE;
45. }
46. publicUsergetUser(){
47. returnUser;
48. }
49. publicvoidsetUser(UserUser){
50. this .User=User;
51. }
52.
53.}
第三步 书写手机端的协议1735