•JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,具備良好的可讀和便於快速編寫的特性。可在不一樣平臺之間進行數據交換。java
JSON採用兼容性很高的、徹底獨立於語言文本格式,同時也具有相似於C語言的習慣(包括C, C++, C#, Java, JavaScript, Perl, Python等)體系的行爲。這些特性使JSON成爲理想的數據交換語言。android
•本質就是具備特定格式的字符串web
•JSON數據已是客戶端與服務器端交互的最經常使用的選擇, 已經不多使用xml來進行數據交互了編程
•總體結構: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}
解析技術:
•Android原生API : 編程相對麻煩
•Gson框架 : 編碼簡潔, 項目首選
解析方向:
•將java對象(包含集合)轉換爲json格式字符串(服務器)
將json格式字符串轉換爲java對象(包含集合)
•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() : 獲得類型對象
測試解析{ } { "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.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()); } }
在Android中,常見的XML解析器分別爲SAX解析器、DOM解析器和PULL解析器,下面,我給你們作詳細的介紹。
SAX(Simple API for XML)解析器是一種基於事件的解析器,它的核心是事件處理模式,主要是圍繞着事件源以及事件處理器來工做的。當事件源產生事件後,調用事件處理器相應的處理方法,一個事件就能夠獲得處理。在事件源調用事件處理器中特定方法的時候,還要傳遞給事件處理器相應事件的狀態信息,這樣事件處理器纔可以根據提供的事件信息來決定本身的行爲。
總結:SAX解析器的優勢是解析速度快,佔用內存少。很是適合在Android移動設備中使用。
DOM是基於樹形結構的的節點或信息片斷的集合,容許開發人員使用DOM API遍歷XML樹、檢索所需數據。分析該結構一般須要加載整個文檔和構造樹形結構,而後才能夠檢索和更新節點信息。
總結: 因爲DOM在內存中以樹形結構存放,所以檢索和更新效率會更高。可是對於特別大的文檔,解析和加載整個文檔將會很耗資源。
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。
參考的文章:www.moliying.com
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中推廣還屬於初級階段。
(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。
(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仍有不可動搖的地位。
<1>.用XML表示中國部分省市數據以下:
<2>.用JSON表示中國部分省市數據以下: