• 第八章 网络的时代—网络开发(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方式去做,这样被破解的可能性就小非常多了。


  • 相关阅读:
    Flutter开发指南之理论篇:Dart语法05(单线程模型,事件循环模型,Isolate)
    跨平台将终结
    一万字详解 Redis Cluster Gossip 协议
    Java实现简单的计算器
    CSDN开发者周刊第 22期:谷歌 DeepMind 第四代:不学规则就可以玩游戏;图灵奖得主 Edmund Clarke 因感染“新冠”逝世;
    理解Python闭包,这应该是最好的例子
    sscanf函数用法详解
    web项目中配置多个数据源
    web项目中配置多个数据源
    动态表格之查看、删除、编辑
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7123148.html
Copyright © 2020-2023  润新知