探究Android系統中解析JSON資料的方式_java

來源:互聯網
上載者:User

前言
喜歡在前言裡講一下自己的現狀,或許能有共鳴的同學,更多的是留給自己一個紀念,幾個月或者幾年再回來看的時候還是會很有感慨。今天說說語言,json這種資料格式之前我做伺服器端的時候天天接觸,天真的以為json的世界裡只有php的json_encode和json_decode,今天當我做用戶端的時候,竟然將近一個多小時才搞定json的解析。這裡我不是抨擊php好壞,只是想說多學點東西,看看你不熟悉的領域,方能開闊自己的視野,方能知道天外有天,方能知道當初你看不上的工作其實你也不一定能很好的完成,扯多了,回來講解json


什麼是json
json(Javascript Object Natation)是一種輕量級的資料交換格式,相比xml這種資料交換格式來說,json相對解析更加簡單一些,因此用戶端和伺服器的資料交換格式往往通過json進行交換

json一共有兩種資料結構,一種是以(key/value)對形式存在的無序的jsonObject對象,一個對象以“{”(左花括弧)開始,“}”(右花括弧)結束。每個“名稱”後跟一個“:”(冒號); “名稱/值”對之間使用“,”(逗號)

例如:{”name“:"zhengyi.wzy"},這就是一個最簡單的json對象,對於這種資料格式,key值必須是String,而value則可以是String,Number,Object,Array等資料類型

另一種資料格式就是有序的value的集合,這種形式被稱為是jsonArray,數組是值(value)的有序集合。一個數組以”[“(左中括弧)開始,”]“(右中括弧)結束。值之間使用”,“(逗號)分隔

Android中json相關解析類
android的json解析部分都在包org.json下,主要有以下幾個類:

JSONObject
這是系統中有關JSON定義的基本單元,其包含一對(key/value)數值

它對外部(External:應用toString()方法輸出的數值)調用的響應體現為一個標準的字串(例如:{“json”: “Hello, World”},最外被大括弧包裹,其中的key和value被冒號”:”分隔)。其對於內部(Internal)行為的操作格式略微,例如:初始化一個JSONObject執行個體,引用內部的put()方法添加數值:new JSONObject().put(“json”, “Hello, World!”),在key和value之間是以逗號”,”分隔

value的類型包括: JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL

有兩種不同的取值方式:

    get():在確定key存在的條件下使用,否則當無法檢索到相關key時,將會拋出一個Exception異常資訊
    opt():這個方法相對比較靈活,當無法擷取所指定數值時,將會返回一個預設值,並不會拋出異常(個人推薦使用這個方法)


JSONArray
它代表一組有序的數值。將其轉換為String輸出(toString)所表現的形式是用方括弧包裹,數值以逗號”,”分隔(例如:[”Alibaba“,”Baidu“,“Tecent”])

這個類的內部同樣具有查詢行為,get()和opt()兩種方法都可以通過index索引返回指定的數值,put()方法用來添加或者替換數值

同樣JSONArray的value類型可以包括:JSONObjects, JSONArrays, Strings, Booleans, Integers, Longs, Doubles or NULL


Android解析執行個體
用戶端一般從伺服器獲得都是字串,直接new一個JSONObject即可,參考程式如下

擷取json字串
這個網址提供了json字串:http://api.androidhive.info/contacts/, 我們可以開啟一個線程發起http請求,擷取json字串,參考代碼如下:

  

 private String getJsonByNetwork() {     // You can get json by this url     final String url = "http://api.androidhive.info/contacts/";     DefaultHttpClient httpClient = new DefaultHttpClient();     HttpGet httpGet = new HttpGet(url);        InputStream inputStream = null;     String result = null;        try {       HttpResponse response = httpClient.execute(httpGet);       inputStream = response.getEntity().getContent();          // Json is UTF-8 by default       BufferedReader reader = new BufferedReader(new InputStreamReader(           inputStream, "UTF-8"));       StringBuilder sb = new StringBuilder();       String tmp = null;          while ((tmp = reader.readLine()) != null) {         sb.append(tmp);       }          result = sb.toString();     } catch (Exception e) {       try {         if (inputStream != null) {           inputStream.close();         }       } catch (IOException se) {       }     }        return result;   } 

解析json字串
解析json字串的步驟一般如下所示:

(1) 建立JSONObject:

  // Create a JSONObject   JSONObject jsonObject = new JSONObject(result); 


(2) 擷取JSONArray,遍曆JSONArray數組

  // To get a specific JSONArray   JSONArray jsonArray = jsonObject.getJSONArray("contacts");      // To get items from the array   for (int i = 0; i < jsonArray.length(); i ++) {     // TODO:Traverse the jsonarray   } 


(3) 擷取JSONObject

  // Create a JSONObject   JSONObject jsonObject = new JSONObject(result);      // To get a specific JSONArray   JSONArray jsonArray = jsonObject.getJSONArray("contacts");      // To get items from the array   for (int i = 0; i < jsonArray.length(); i++) {     // To get a specific JSONObject     JSONObject oneObject = jsonArray.getJSONObject(i);   } 


(4)擷取特定字串

  // Create a JSONObject   JSONObject jsonObject = new JSONObject(result);      // To get a specific JSONArray   JSONArray jsonArray = jsonObject.getJSONArray("contacts");      // To get items from the array   for (int i = 0; i < jsonArray.length(); i++) {     // To get a specific JSONObject     JSONObject oneObject = jsonArray.getJSONObject(i);        // To get a specific string     String id = oneObject.getString("id");     String name = oneObject.getString("name");        Log.e("wzy", "id is:" + id + ", name is " + name);   } 


解析結果:

  03-05 10:26:08.690: E/wzy(26401): id is:c200, name is Ravi Tamada   03-05 10:26:08.690: E/wzy(26401): id is:c201, name is Johnny Depp   03-05 10:26:08.690: E/wzy(26401): id is:c202, name is Leonardo Dicaprio   03-05 10:26:08.690: E/wzy(26401): id is:c203, name is John Wayne   03-05 10:26:08.691: E/wzy(26401): id is:c204, name is Angelina Jolie   03-05 10:26:08.691: E/wzy(26401): id is:c205, name is Dido   03-05 10:26:08.691: E/wzy(26401): id is:c206, name is Adele   03-05 10:26:08.692: E/wzy(26401): id is:c207, name is Hugh Jackman   03-05 10:26:08.693: E/wzy(26401): id is:c208, name is Will Smith   03-05 10:26:08.693: E/wzy(26401): id is:c209, name is Clint Eastwood   03-05 10:26:08.694: E/wzy(26401): id is:c2010, name is Barack Obama   03-05 10:26:08.694: E/wzy(26401): id is:c2011, name is Kate Winslet   03-05 10:26:08.695: E/wzy(26401): id is:c2012, name is Eminem 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.