Android中如何使用JSON来实现客户端和服务器的交互
首先来了解一下JSON:
JSON的定义:一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性。业内主流技术为其提供了完整的解决方案(有点类似于正则表达式,获得了当今大部分语言的支持),从而可以在不同平台间进行数据交换。JSON采用兼容性很高的文本格式,同时也具备类似于C语言体系的行为。 
Json.orgJSON的结构:Name/Value Pairs,类似所熟知的Keyed list、 Hash table、Disctionary和Associative array。在Andro辣,文-论'文:网http://www.751com.cn 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.751com.cn 的搭建
如果远程服务器使用了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.751com.cn  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