首页 > 代码库 > 第八章 网络的时代—网络开发(4)
第八章 网络的时代—网络开发(4)
8.5轻量级的数据交换格式—JSON
8.5.1 client与server端的数据交互
在Android应用开发中,尤其是网络应用的开发,我们常常须要从网络上获取数据,而不只从本地数据库或者本地文件里取得数据,这个时候就涉及到client与server端的数据交互了。client怎样须要与server端进行数据交互。就须要约定一种协议或者是数据交换格式。
那么一般的。Androidclient与server端进行数据交互有哪些方式呢?依据业务需求的不同,可能会选用不用的方式,通常有以下几种方式。
1)基于SOAP的Web服务(WebService)方式
Web服务是一种面向服务的架构的技术,通过标准的Web协议提供服务。目的是保证不同平台的应用服务能够互操作。
依据W3C的定义,Web服务应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务一般是很多应用程序接口所组成的,它们通过网络,比如国际互联网的远程server端。运行客户所提交服务的请求。
Web服务是基于XML和HTTPS的一种服务,其通信协议主要基于SOAP。通过WSDL来描写叙述服务,通过UDDI来发现和获得服务的元数据。
2)自己定义XML数据格式的方式
除了使用标准的SOAP协议以外。项目组还能够自己定义XML数据格式用来传递数据。
比方项目能够约定例如以下XML格式。用来传递用户的数据信息。
<request> <type>1</type> <id>100000</id> <name>jname</name> <state>1</state> …… </request> |
3)JSON数据格式
JSON(JavascriptObjectNotation)是一种轻量级的资料交换语言。以文字为基础,且易于让人阅读。虽然JSON是在Javascript的一个子集。但JSON是独立于语言的文本格式,能够使用于不论什么语言。
JSON用于描写叙述数据结构。有以下形式存在。
对象(object):一个对象以“{”開始,并以“}”结束。一个对象包括一系列非排序的名称/值对。每一个名称/值对之间使用“。”切割。
名称/值对(collection):名称和值之间使用“:”隔开。一般的形式是:
{name:value}
一个名称是一个字符串。一个值能够是一个字符串,一个数值,一个对象,一个布林值,一个有序列表。或者一个null值。
值的有序列表(Array):一个或者多个值用“,”切割后。使用“[”,“]”括起来就形成了这种列表。形如:
[collection,collection]
字符串:以""括起来的一串字符。
数值:一系列0-9的数字组合,能够为负数或者小数。还能够用“e”或者“E”表示为指数形式。
布尔值:表示为true 或者false。
以下的样例就能够清晰的说明JSON格式的结构。
{ "firstName":"John", "lastName":"Smith", "male":true, "age":25, "address": { "streetAddress":"21 2nd Street", "city":"New York", "state":"NY", "postalCode":"10021" }, "phoneNumber": [ { "type":"home", "number":"212 555-1234" }, { "type":"fax", "number":"646 555-4567" } ] } |
8.5.2 XML格式与JSON格式的比較
不管是Web服务的方式。还是自己定义XML的方式,都是以XML格式为基础的。现在JSON数据格式已经在网络开发中越来越流行了,在非常多场合都能够代替XML格式。这主要是由于JSON更适合网络数据的传输。那么。详细的,JSON数据格式与XML数据格式相比較,都有哪些优缺点呢。
使用XML作为传输格式的优势:
1)格式统一,符合标准。
2)easy与其它系统进行远程交互,数据共享比較方便。
使用XML格式的缺点:
1)XML文件格式文件庞大。格式复杂。传输占用带宽。
2)server端和client都须要花费大量代码来解析XML,不论server端和client代码变的异常复杂和不easy维护。
3)client不同浏览器之间解析XML的方式不一致,须要反复编写非常多代码。
4)server端和client解析XML花费资源和时间。
使用JSON格式的长处:
1)数据格式比較简单,易于读写。格式都是压缩的。占用带宽小。
2)易于解析这种语言。clientJavaScript能够简单的通过eval()进行JSON数据的读取。
3)支持多种语言。包括ActionScript、C、C#、ColdFusion、Java、JavaScript、Perl、PHP、Python、Ruby等语言server端语言。便于server端的解析。
4)在PHP世界,已经有PHP-JSON和JSON-PHP出现了,便于PHP序列化后的程序直接调用。PHPserver端的对象、数组等能够直接生JSON格式。便于client的訪问提取。
5)由于JSON格式能够直接为server端代码使用。大大简化了server端和client的代码开发量。可是完毕的任务不变,且易于维护。
使用JSON格式的缺点:
1)没有XML格式这么推广的深入人心和使用广泛,没有XML那么通用性。
2)JSON格式眼下在WebService中推广还属于0基础阶段。
通过上面的对照我们能够看出。JSON是一种轻量级的数据交换格式。具有良好的可读和便于高速编写的特性,能够在不同平台间进行数据交换。为了节省内存,提高响应速度,在Android网络应用的开发中比較适合使用JSON格式。
8.5.3 解析JSON格式数据
AndroidSDK有一个包直接支持JSON格式的数据解析。都在org.json下,主要有以下几个类:
1)JSONObject
能够看作是一个JSON对象。这是系统中有关JSON定义的基本单元,其包括一对儿(Key/Value)数值。
2)JSONStringer
JSON文本构建类,依据官方的解释,这个类能够帮助高速和便捷的创建JSONtext。其最大的长处在于能够降低由于格式的错误导致程序异常。引用这个类能够自己主动严格依照JSON语法规则(syntaxrules)创建JSONtext。每一个JSONStringer实体只能相应创建一个JSONtext。
3)JSONArray
它代表一组有序的数值。
将其转换为String输出所表现的形式是用方括号包裹,数值以逗号”,”分隔(比如:[value1,value2,value3],大家能够亲自利用简短的代码更加直观的了解其格式)。
4)JSONTokener
JSON解析类。
5)JSONException
JSON解析过程中可能发生的异常。
以下我们就通过代码来说明怎样在Android中对JSON数据进行解析。
假设我们已经能够从server端获取数据了。并且返回的JSON数据例如以下:
{"FLAG":"flag", "jobject":[ {"id":"100000","name":"jname","state":1}, {"id":"200000","name":"jname","state":2}]} |
以下的代码片段举例说明怎样解析出FLAG对象和jobject对象。
/** *对JSON格式数据进行解析 */ publicvoid readJSON(String str){ try{ //转换为JSONObject JSONObjectresult = new JSONObject(str); Log.d("readJSON","FLAG = " + result.getString("FLAG")); //获取JSONArray数组 JSONArrayjsonArray = result.getJSONArray("jobject"); Log.d("readJSON","Numberof entries " + jsonArray.length()); for(int i = 0; i < jsonArray.length(); i++) { JSONObjectjsonObject = jsonArray.getJSONObject(i); Log.d("readJSON","id= " + jsonObject.getString("id")); Log.di("readJSON","name= " + jsonObject.getString("name")); Log.d("readJSON","state= " + jsonObject.getString("state")); } }catch (Exception e) { e.printStackTrace(); } } |
以下的代码片段说明了怎样简单的构造一个JSON串。
/** *构造一个JSON格式的数据 */ publicString writeJSON() { JSONObjectobject = new JSONObject(); try{ object.put("id","100000"); object.put("name","jname"); object.put("state",new Integer(1)); }catch (JSONException e) { e.printStackTrace(); } Log.d("writeJSON",object.toString()); returnobject.toString(); } |
构造好的JSON串能够通过POST方式发送给server端,server端再进行解析,运行兴许的业务流程。
图8-4展示了上面的演示样例代码的运行结果。
图8-4JSON读写结果图
通过上面的样例能够看出,在Android开发中,使用JSON格式的数据与server端交互还是非常方便的。
经验分享: 不管是採用JSON格式。还是自己定义XML格式,client与server端传输的数据都是明文的,这样并不安全。所以,假设项目对数据安全性有一定的要求。务必要考虑做下加密解密的工作。 另外,由于Android的APK包非常easy被反编译,假设单纯的使用Java来实现加密解密的代码,就非常easy泄露详细算法。 所以,假设项目中涉及到加密解密的操作,能够考虑使用JNI方式去做,这样被破解的可能性就小非常多了。 |
第八章 网络的时代—网络开发(4)