第八章 网络的时代—网络开发(4)

8.5轻量级的数据交换格式—JSON

8.5.1 client与server端的数据交互

Android应用开发中,尤其是网络应用的开发,我们常常须要从网络上获取数据,而不只从本地数据库或者本地文件里取得数据,这个时候就涉及到client与server端的数据交互了。client怎样须要与server端进行数据交互。就须要约定一种协议或者是数据交换格式。

那么一般的。Androidclient与server端进行数据交互有哪些方式呢?依据业务需求的不同,可能会选用不用的方式,通常有以下几种方式。

1)基于SOAPWeb服务(WebService)方式

Web服务是一种面向服务的架构的技术,通过标准的Web协议提供服务。目的是保证不同平台的应用服务能够互操作。

依据W3C的定义,Web服务应当是一个软件系统,用以支持网络间不同机器的互动操作。网络服务一般是很多应用程序接口所组成的,它们通过网络,比如国际互联网的远程server端。运行客户所提交服务的请求。

Web服务是基于XMLHTTPS的一种服务,其通信协议主要基于SOAP。通过WSDL来描写叙述服务,通过UDDI来发现和获得服务的元数据。

2)自己定义XML数据格式的方式

除了使用标准的SOAP协议以外。项目组还能够自己定义XML数据格式用来传递数据。

比方项目能够约定例如以下XML格式。用来传递用户的数据信息。

<request>

<type>1</type>

<id>100000</id>

<name>jname</name>

<state>1</state>

……

</request>


3JSON数据格式

JSONJavascriptObjectNotation)是一种轻量级的资料交换语言。以文字为基础,且易于让人阅读。虽然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格式的缺点:

1XML文件格式文件庞大。格式复杂。传输占用带宽。

2)server端和client都须要花费大量代码来解析XML,不论server端和client代码变的异常复杂和不easy维护。

3)client不同浏览器之间解析XML的方式不一致,须要反复编写非常多代码。

4)server端和client解析XML花费资源和时间。

使用JSON格式的长处:

1)数据格式比較简单,易于读写。格式都是压缩的。占用带宽小。

2)易于解析这种语言。clientJavaScript能够简单的通过eval()进行JSON数据的读取。

3)支持多种语言。包括ActionScriptCC#ColdFusionJavaJavaScriptPerlPHPPythonRuby等语言server端语言。便于server端的解析。

4)在PHP世界,已经有PHP-JSONJSON-PHP出现了,便于PHP序列化后的程序直接调用。PHPserver端的对象、数组等能够直接生JSON格式。便于client的訪问提取。

5)由于JSON格式能够直接为server端代码使用。大大简化了server端和client的代码开发量。可是完毕的任务不变,且易于维护。

使用JSON格式的缺点:

1)没有XML格式这么推广的深入人心和使用广泛,没有XML那么通用性。

2JSON格式眼下在WebService中推广还属于0基础阶段。

通过上面的对照我们能够看出。JSON是一种轻量级的数据交换格式。具有良好的可读和便于高速编写的特性,能够在不同平台间进行数据交换。为了节省内存,提高响应速度,在Android网络应用的开发中比較适合使用JSON格式。

8.5.3 解析JSON格式数据

AndroidSDK有一个包直接支持JSON格式的数据解析。都在org.json下,主要有以下几个类:

1JSONObject

能够看作是一个JSON对象。这是系统中有关JSON定义的基本单元,其包括一对儿(Key/Value)数值。

2JSONStringer

JSON文本构建类,依据官方的解释,这个类能够帮助高速和便捷的创建JSONtext。其最大的长处在于能够降低由于格式的错误导致程序异常。引用这个类能够自己主动严格依照JSON语法规则(syntaxrules)创建JSONtext。每一个JSONStringer实体只能相应创建一个JSONtext

3JSONArray

它代表一组有序的数值。

将其转换为String输出所表现的形式是用方括号包裹,数值以逗号”,”分隔(比如:[value1,value2,value3],大家能够亲自利用简短的代码更加直观的了解其格式)。

4JSONTokener

JSON解析类。

5JSONException

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端传输的数据都是明文的,这样并不安全。所以,假设项目对数据安全性有一定的要求。务必要考虑做下加密解密的工作。

另外,由于AndroidAPK包非常easy被反编译,假设单纯的使用Java来实现加密解密的代码,就非常easy泄露详细算法。

所以,假设项目中涉及到加密解密的操作,能够考虑使用JNI方式去做,这样被破解的可能性就小非常多了。


原文地址:https://www.cnblogs.com/liguangsunls/p/7123148.html