網絡數據交換格式

                                             1.Json的講解

1.1json是什麼?

•JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,具備良好的可讀和便於快速編寫的特性。可在不一樣平臺之間進行數據交換。java

JSON採用兼容性很高的、徹底獨立於語言文本格式,同時也具有相似於C語言的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)體系的行爲。這些特性使JSON成爲理想的數據交換語言。android

•本質就是具備特定格式的字符串web

•JSON數據已是客戶端與服務器端交互的最經常使用的選擇, 已經不多使用xml來進行數據交互了編程

1.2json的數據格式

•總體結構:json

•Json數組 :  [ ]api

•Json對象: {  }數組

•Json數組的結構: [value1, value2, value3]瀏覽器

•Json對象的結構: {key1:value1, key2:value2, key3:value3}服務器

•key的數據類型: 字符串框架

•value的數據類型:

•數值

•字符串

•null

•json數組 []

•json對象 {}

•例子:

      [1, 「ab」,[], {「n」:123, 「b」:」abc」}]       [1, 「a」:3]
          {「name」:」TOM」, 「age」:12}      {「aa」:「a」, 3}

2.1json的解析

解析技術:

•Android原生API : 編程相對麻煩

•Gson框架 : 編碼簡潔, 項目首選

解析方向:

•將java對象(包含集合)轉換爲json格式字符串(服務器)

將json格式字符串轉換爲java對象(包含集合)

2.2相關的api

•Android原生API:

•JsonObject : json對象   { }

•JSONObject(String json) : 將json字符串解析爲json對象

•Xxx getXxx(String name) : 根據name, 在json對象中獲得對應的Value

•JsonArray : json數組   []

•JSONArray(String json) : 將json字符串解析爲json數組

•int length() : 獲得json數組中元素的個數

•Xxx getXxx(int index) : 根據下標獲得json數組中對應的元素數據

•Gson框架API

•Gson : 能解析json數據的類

•Gson() : 構造對象的方法

•String toJson(Object src) : 將對象轉換爲對應格式的json字符串

•T fromJson(String json, Type typeOfT) : 解析Json字符串, 獲得對象

•TypeToken<T> : 用來獲得Type的類

•protected TypeToken() : 受保存的構造方法

•Type getType() : 獲得類型對象

3.測試數據

測試解析{ }
{
	"id":2, "name":"大蝦", 
	"price":12.3, 
	"imagePath":"http://192.168.10.165:8080/L05_Server/images/f1.jpg"
}
測試解析[ ]
[
	{
	"id":1, "name":"大蝦1", 
	"price":12.3, 
	"imagePath":"http://192.168.10.165:8080/f1.jpg"
},
{
	"id":2, "name":"大蝦2", 
	"price":12.5, 
	"imagePath":"http://192.168.10.165:8080/f2.jpg"
}
]

4.測試案例

4.1實體類ShopInfo的代碼:

public class ShopInfo {

	private int id;
	private String name;
	private double price;
	private String imagePath;

	public ShopInfo(int id, String name, double price, String imagePath) {
		super();
		this.id = id;
		this.name = name;
		this.price = price;
		this.imagePath = imagePath;
	}

	public ShopInfo() {
		super();
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public String getImagePath() {
		return imagePath;
	}

	public void setImagePath(String imagePath) {
		this.imagePath = imagePath;
	}

	@Override
	public String toString() {
		return "ShopInfo [id=" + id + ", name=" + name + ", price=" + price
				+ ", imagePath=" + imagePath + "]";
	}

}

4.2測試類JsonTest 的代碼:

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.test.AndroidTestCase;
import android.util.Log;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;

/*
1. 將json格式的字符串{}轉換爲Java對象, 使用原生API
2. 將json格式的字符串{}轉換爲Java對象, 使用GSON
3. 將json格式的字符串[]轉換爲Java對象的List, 使用原生API
4. 將json格式的字符串[]轉換爲Java對象的List, 使用GSON

5. 將Java對象轉換爲json字符串{}, 使用GSON
6. 將Java對象的List轉換爲json字符串[], 使用GSON
 */
public class JsonTest extends AndroidTestCase{

	/*
	 * 1. 將json格式的字符串{}轉換爲Java對象, 使用原生API
	 */
	public void testJsonToObject() throws JSONException {
		String jsonString = "{\"id\":2, \"name\":\"大蝦\", \"price\":12.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"}";
		
		//將json字符串封裝爲JSONObject對象
		JSONObject jsonObject = new JSONObject(jsonString);
		//從對象中根據key獲得對應的value
		int id = jsonObject.getInt("id");
		String name = jsonObject.getString("name");
		double price = jsonObject.getDouble("price");
		String imagePath = jsonObject.getString("imagePath");
		//封裝ShopInfo對象
		ShopInfo shopInfo = new ShopInfo(id, name, price, imagePath);
		
		Log.e("TAG", shopInfo.toString());
	}
	
	/*
	 * 1. 將json格式的字符串{}轉換爲Java對象, 使用GSON
	 */
	public void testJsonToObject2()  {
		String jsonString = "{\"id\":3, \"name\":\"大蝦\", \"price\":12.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"}";
		
		ShopInfo shopInfo = new Gson().fromJson(jsonString, ShopInfo.class);
		
		Log.e("TAG", shopInfo.toString());
	}
	
	
	/*
	 * 3. 將json格式的字符串[]轉換爲Java對象的List, 使用原生API
	 */
	public void testJsonToList() throws JSONException {
		String jsonString = "[{\"id\":3, \"name\":\"大蝦\", \"price\":12.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"},"
				+ "{\"id\":5, \"name\":\"大蝦2\", \"price\":128.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f2.jpg\"}]";
		List<ShopInfo> list = new ArrayList<ShopInfo>();
		
		//1. 將json字符串包裝JSONArray對象
		JSONArray jsonArray = new JSONArray(jsonString);
		//2. 遍歷JSONArray對象全部元素(JSONObject), 並將每一個元素封裝爲shopInfo, 並添加到List
		for(int i=0;i<jsonArray.length();i++) {
			JSONObject jsonObject = jsonArray.getJSONObject(i);
			//從對象中根據key獲得對應的value
			int id = jsonObject.getInt("id");
			String name = jsonObject.getString("name");
			double price = jsonObject.getDouble("price");
			String imagePath = jsonObject.getString("imagePath");
			//封裝ShopInfo對象
			ShopInfo shopInfo = new ShopInfo(id, name, price, imagePath);
			list.add(shopInfo);
		}
		
		Log.e("TAG", list.toString());
	}
	
	/*
	 * 4. 將json格式的字符串[]轉換爲Java對象的List, 使用GSON
	 */
	public void testJsonToList2() throws JSONException {
		String jsonString = "[{\"id\":4, \"name\":\"大蝦\", \"price\":12.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f1.jpg\"},"
				+ "{\"id\":6, \"name\":\"大蝦2\", \"price\":128.3,\"imagePath\":\"http://192.168.10.165:8080/L05_Server/images/f2.jpg\"}]";
		
		List<ShopInfo> list = new Gson().fromJson(jsonString, new TypeToken<List<ShopInfo>>(){}.getType());
		
		Log.e("TAG", list.toString());
	}
	
	/*
		5. 將Java對象轉換爲json字符串{}, 使用GSON
	*/
	public void testObjectToJson() {
		ShopInfo info = new ShopInfo(3, "KK", 1000, "http://www.sina.com");
		String json = new Gson().toJson(info);
		Log.e("TAG", json);
	}
	
	
	/*
		6. 將Java對象的List轉換爲json字符串[], 使用GSON
	*/
	
	public void testListToJson() {
		
		List<ShopInfo> list = new ArrayList<ShopInfo>();
		list.add(new ShopInfo(3, "KK", 1000, "http://www.sina.com"));
		list.add(new ShopInfo(4, "KK2", 2000, "http://www.sina.com222"));
		
		String json = new Gson().toJson(list);
		
		Log.e("TAG", json);
	}
	
	public void testJsonToMap() {
		String jsonString = "{\"my name\":\"大蝦\", \"1\":12}";
		Map<String, Object> map = new Gson().fromJson(jsonString, new TypeToken<Map<String, Object>>(){}.getType());
		Log.e("TAG", map.toString());
	}
}

                                     2.XML數據講解

XML定義

擴展標記語言 (Extensible Markup Language, XML) ,用於標記電子文件使其具備結構性的標記語言,能夠用來標記數據、定義數據類型,是一種容許用戶對本身的標記語言進行定義的源語言。 XML使用DTD(document type definition)文檔類型定義來組織數據;格式統一,跨平臺和語言,早已成爲業界公認的標準。XML是標準通用標記語言 (SGML) 的子集,很是適合 Web 傳輸。XML 提供統一的方法來描述和交換獨立於應用程序或供應商的結構化數據。

 在Android中,常見的XML解析器分別爲SAX解析器、DOM解析器和PULL解析器,下面,我給你們作詳細的介紹。

1.SAX解析器:

SAX(Simple API for XML)解析器是一種基於事件的解析器,它的核心是事件處理模式,主要是圍繞着事件源以及事件處理器來工做的。當事件源產生事件後,調用事件處理器相應的處理方法,一個事件就能夠獲得處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態信息,這樣事件處理器纔可以根據提供的事件信息來決定本身的行爲。
總結:SAX解析器的優勢是解析速度快,佔用內存少。很是適合在Android移動設備中使用。

2. DOM解析器:

 DOM是基於樹形結構的的節點或信息片斷的集合,容許開發人員使用DOM API遍歷XML樹、檢索所需數據。分析該結構一般須要加載整個文檔和構造樹形結構,而後才能夠檢索和更新節點信息。

總結: 因爲DOM在內存中以樹形結構存放,所以檢索和更新效率會更高。可是對於特別大的文檔,解析和加載整個文檔將會很耗資源。

3. PULL解析器:

PULL解析器的運行方式和SAX相似,都是基於事件的模式。不一樣的是,在PULL解析過程當中,咱們須要本身獲取產生的事件而後作相應的操做,而不像SAX那樣由處理器觸發一種事件的方法,執行咱們的代碼。PULL解析器小巧輕便,解析速度快,簡單易用,很是適合在Android移動設備中使用,Android系統內部在解析各類XML時也是用PULL解析器。
總結: 在Android中,首推固然就是pull解析器了。PULL解析器小巧輕便,解析速度快,簡單易用,很是適合在Android移動設備中使用,Android系統內部在解析各類XML時也是用PULL解析器,Android官方推薦開發者們使用Pull解析技術。Pull解析技術是第三方開發的開源技術,它一樣能夠應用於JavaSE開發。
3.1 PULL 的工做原理:

 XML pull提供了開始元素和結束元素。當某個元素開始時,能夠調用parser.nextText從XML文檔中提取全部字符數據。當解析到一個文檔結束時,自動生成EndDocument事件。

經常使用的XML pull的接口和類:

XmlPullParser:該解析器是一個在org.xmlpull.v1中定義的解析功能的接口。

XmlSerializer:它是一個接口,定義了XML信息集的序列。

XmlPullParserFactory:這個類用於在XMPULL V1 API中建立XML Pull解析器。

XmlPullParserException:拋出單一的XML pull解析器相關的錯誤。

 PULL解析器的運行方式和SAX相似,都是基於事件的模式。

不一樣的是,在PULL解析過程當中返回的是數字,且咱們須要本身獲取產生的事件而後作相應的操做,而不像SAX那樣由處理器觸發一種事件的方法,執行咱們的代碼: 

讀取到xml的聲明返回 START_DOCUMENT;

結束返回 END_DOCUMENT ;

開始標籤返回 START_TAG; 

結束標籤返回 END_TAG;

文本返回 TEXT。

4.最後對這3個解析技術作個比較與總結:

  1. 對於Android的移動設備而言,由於設備的資源比較寶貴,內存是有限的,因此咱們須要選擇適合的技術來解析XML,這樣有利於提升訪問的速度。

  2.   DOM在處理XML文件時,將XML文件解析成樹狀結構並放入內存中進行處理。當XML文件較小時,咱們能夠選DOM,由於它簡單、直觀。

  3. SAX則是以事件做爲解析XML文件的模式,它將XML文件轉化成一系列的事件,由不一樣的事件處理器來決定如何處理。XML文件較大時,選擇SAX技術是比較合理的。雖然代碼量有些大,可是它不須要將全部的XML文件加載到內存中。這樣對於有限的Android內存更有效,並且Android提供了一種傳統的SAX使用方法以及一個便捷的SAX包裝器。 使用Xml類,會比使用 SAX來得簡單。

  4.    XML pull解析並未像SAX解析那樣監聽元素的結束,而是在開始處完成了大部分處理。這有利於提前讀取XML文件,能夠極大的減小解析時間,這種優化對於鏈接速度較漫的移動設備而言尤其重要。對於XML文檔較大但只須要文檔的一部分時,XML Pull解析器則是更爲有效的方法。

        參考的文章www.moliying.com

                               3.XML與JSON的對比

1.XML和JSON優缺點:

1.1XML的優缺點:

<1>.XML的優勢

A.格式統一,符合標準;

B.容易與其餘系統進行遠程交互,數據共享比較方便。

<2>.XML的缺點

A.XML文件龐大,文件格式複雜,傳輸佔帶寬;

B.服務器端和客戶端都須要花費大量代碼來解析XML,致使服務器端和客戶端代碼變得異常複雜且不易維護;

C.客戶端不一樣瀏覽器之間解析XML的方式不一致,須要重複編寫不少代碼;

D.服務器端和客戶端解析XML花費較多的資源和時間。

1.2JSON的優缺點:

<1>.JSON的優勢:

A.數據格式比較簡單,易於讀寫,格式都是壓縮的,佔用帶寬小;

B.易於解析,客戶端JavaScript能夠簡單的經過eval()進行JSON數據的讀取;

C.支持多種語言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服務器端語言,便於服務器端的解析;

D.在PHP世界,已經有PHP-JSON和JSON-PHP出現了,偏於PHP序列化後的程序直接調用,PHP服務器端的對象、數組等能直接生成JSON格式,便於客戶端的訪問提取;

E.由於JSON格式能直接爲服務器端代碼使用,大大簡化了服務器端和客戶端的代碼開發量,且完成任務不變,而且易於維護。

<2>.JSON的缺點

A.沒有XML格式這麼推廣的深刻人心和喜用普遍,沒有XML那麼通用性;

B.JSON格式目前在Web Service中推廣還屬於初級階段。

二、XML和JSON的優缺點對比:

(1).可讀性方面。

JSON和XML的數據可讀性基本相同,JSON和XML的可讀性可謂不相上下,一邊是建議的語法,一邊是規範的標籤形式,XML可讀性較好些。

(2).可擴展性方面。

XML天生有很好的擴展性,JSON固然也有,沒有什麼是XML能擴展,JSON不能的。

(3).編碼難度方面。

XML有豐富的編碼工具,好比Dom4j、JDom等,JSON也有json.org提供的工具,可是JSON的編碼明顯比XML容易許多,即便不借助工具也能寫出JSON的代碼,但是要寫好XML就不太容易了。

(4).解碼難度方面。

XML的解析得考慮子節點父節點,讓人頭昏眼花,而JSON的解析難度幾乎爲0。這一點XML輸的真是沒話說。

(5).流行度方面。

XML已經被業界普遍的使用,而JSON纔剛剛開始,可是在Ajax這個特定的領域,將來的發展必定是XML讓位於JSON。到時Ajax應該變成Ajaj(Asynchronous Javascript and JSON)了。

(6).解析手段方面。

JSON和XML一樣擁有豐富的解析手段。

(7).數據體積方面。

JSON相對於XML來說,數據的體積小,傳遞的速度更快些。

(8).數據交互方面。

JSON與JavaScript的交互更加方便,更容易解析處理,更好的數據交互。

(9).數據描述方面。

JSON對數據的描述性比XML較差。

(10).傳輸速度方面。

JSON的速度要遠遠快於XML。

3.XML與JSON數據格式比較:

(1).關於輕量級和重量級

輕量級和重量級是相對來講的,那麼XML相對於JSON的重量級體如今哪呢?應該體如今解析上,XML目前設計了兩種解析方式:DOM和 SAX。

<1>.DOM

DOM是把一個數據交換格式XML當作一個DOM對象,須要把XML文件整個讀入內存,這一點上JSON和XML的原理是同樣的,可是XML要考慮父節點和子節點,這一點上JSON的解析難度要小不少,由於JSON構建於兩種結構:key/value,鍵值對的集合;值的有序集合,可理解爲數組;

<2>.SAX

SAX不須要整個讀入文檔就能夠對解析出的內容進行處理,是一種逐步解析的方法。程序也能夠隨時終止解析。這樣,一個大的文檔就能夠逐步的、一點一點的展示出來,因此SAX適合於大規模的解析。這一點,JSON目前是作不到得。

因此,JSON和XML的輕/重量級的區別在於:

JSON只提供總體解析方案,而這種方法只在解析較少的數據時才能起到良好的效果;

XML提供了對大規模數據的逐步解析方案,這種方案很適合於對大量數據的處理。

(2).關於數據格式編碼及解析難度

<1>.在編碼方面。

雖然XML和JSON都有各自的編碼工具,可是JSON的編碼要比XML簡單,即便不借助工具,也能夠寫出JSON代碼,但要寫出好的XML代碼就有點困難;與XML同樣,JSON也是基於文本的,且它們都使用Unicode編碼,且其與數據交換格式XML同樣具備可讀性。

主觀上來看,JSON更爲清晰且冗餘更少些。JSON網站提供了對JSON語法的嚴格描述,只是描述較簡短。從整體來看,XML比較適合於標記文檔,而JSON卻更適於進行數據交換處理。

<2>.在解析方面。

在普通的web應用領域,開發者常常爲XML的解析傷腦筋,不管是服務器端生成或處理XML,仍是客戶端用 JavaScript 解析XML,都經常致使複雜的代碼,極低的開發效率。

實際上,對於大多數Web應用來講,他們根本不須要複雜的XML來傳輸數據,XML宣稱的擴展性在此就不多具備優點,許多Ajax應用甚至直接返回HTML片斷來構建動態Web頁面。和返回XML並解析它相比,返回HTML片斷大大下降了系統的複雜性,但同時缺乏了必定的靈活性。同XML或 HTML片斷相比,數據交換格式JSON 提供了更好的簡單性和靈活性。在Web Serivice應用中,至少就目前來講XML仍有不可動搖的地位。

4.、實例比較

XML和JSON都使用結構化方法來標記數據,下面來作一個簡單的比較

<1>.用XML表示中國部分省市數據以下:

<2>.用JSON表示中國部分省市數據以下:

相關文章
相關標籤/搜索