Android JSON解析

來源:互聯網
上載者:User

json相關參考 
json規範rfc4627:http://www.ietf.org/rfc/rfc4627.txt 
json介紹:http://www.json.org/json-zh.html 
json入門參考:http://www.cnblogs.com/Truly/archive/2006/12/31/608896.html 

android2.3提供的json解析類 
android的json解析部分都在包org.json下,主要有以下幾個類: 
JSONObject:可以看作是一個json對象 
JSONStringer:json文本構建類 
JSONArray:可以看作是json的數組 
JSONTokener:json解析類 
JSONException:json中用到的異常 

JSONObject, JSONArray來構建json文本

// 假設現在要建立這樣一個json文本//    {//        "phone" : ["12345678", "87654321"], // 數組//        "name" : "yuanzhifei89", // 字串//        "age" : 100, // 數值//        "address" : { "country" : "china", "province" : "jiangsu" }, // 對象//        "married" : false // 布爾值//    }try {    // 首先最外層是{},是建立一個對象    JSONObject person = new JSONObject();    // 第一個鍵phone的值是數組,所以需要建立數組對象    JSONArray phone = new JSONArray();    phone.put("12345678").put("87654321");    person.put("phone", phone);    person.put("name", "yuanzhifei89");    person.put("age", 100);    // 鍵address的值是對象,所以又要建立一個對象    JSONObject address = new JSONObject();    address.put("country", "china");    address.put("province", "jiangsu");    person.put("address", address);    person.put("married", false);} catch (JSONException ex) {    // 鍵為null或使用json不支援的數字格式(NaN, infinities)    throw new RuntimeException(ex);}

getType和optType api的使用 
getType可以將要擷取的鍵的值轉換為指定的類型,如果無法轉換或沒有值則拋出JSONException 

optType也是將要擷取的鍵的值轉換為指定的類型,無法轉換或沒有值時返回使用者提供或這預設提供的值

try {    // 所有使用的對象都是用上面建立的對象    // 將第一個電話號碼轉換為數值和將名字轉換為數值    phone.getLong(0);    person.getLong("name"); // 會拋異常,因為名字無法轉換為long        phone.optLong(0); // 代碼內建的預設值    phone.optLong(0, 1000); // 使用者提供的預設值    person.optLong("name");    person.optLong("name", 1000); // 不像上面那樣拋異常,而是返回1000} catch (JSONException ex) {    // 異常處理代碼}

除了上面的兩個類,還可以使用JSONStringer來構建json文本

try {    JSONStringer jsonText = new JSONStringer();    // 首先是{,對象開始。object和endObject必須配對使用    jsonText.object();        jsonText.key("phone");    // 鍵phone的值是數組。array和endArray必須配對使用    jsonText.array();    jsonText.value("12345678").value("87654321");    jsonText.endArray();        jsonText.key("name");    jsonText.value("yuanzhifei89");    jsonText.key("age");    jsonText.value(100);        jsonText.key("address");    // 鍵address的值是對象    jsonText.object();    jsonText.key("country");    jsonText.value("china");    jsonText.key("province");    jsonText.value("jiangsu");    jsonText.endObject();        jsonText.key("married");    jsonText.value(false);        // },對象結束    jsonText.endObject();} catch (JSONException ex) {    throw new RuntimeException(ex);}

json文本解析類JSONTokener 
按照RFC4627規範將json文本解析為相應的對象。 

對於將json文本解析為對象,只需要用到該類的兩個api: 
建構函式 
public Object nextValue();

//    {//        "phone" : ["12345678", "87654321"], // 數組//        "name" : "yuanzhifei89", // 字串//        "age" : 100, // 數值//        "address" : { "country" : "china", "province" : "jiangsu" }, // 對象//        "married" : false // 布爾值//    }private static final String JSON = "{" +    "    \"phone\" : [\"12345678\", \"87654321\"]," +    "    \"name\" : \"yuanzhifei89\"," +    "    \"age\" : 100," +    "    \"address\" : { \"country\" : \"china\", \"province\" : \"jiangsu\" }," +    "    \"married\" : false," +"}";try {    JSONTokener jsonParser = new JSONTokener(JSON);    // 此時還未讀取任何json文本,直接讀取就是一個JSONObject對象。    // 如果此時的讀取位置在"name" : 了,那麼nextValue就是"yuanzhifei89"(String)    JSONObject person = (JSONObject) jsonParser.nextValue();    // 接下來的就是JSON對象的操作了    person.getJSONArray("phone");    person.getString("name");    person.getInt("age");    person.getJSONObject("address");    person.getBoolean("married");} catch (JSONException ex) {    // 異常處理代碼}

其它的api基本就是用來查看json文本中的文本的

try {    JSONTokener jsonParser = new JSONTokener(JSON);    // 繼續向下讀8個json文本中的字元。此時剛開始,即在{處    jsonParser.next(8); //{    "phone。tab算一個字元        // 繼續向下讀1個json文本中的字元    jsonParser.next(); //"        // 繼續向下讀取一個json文本中的字元。該字元不是空白、同時也不是注視中的字元    jsonParser.nextClean(); //:        // 返回當前的讀取位置到第一次遇到'a'之間的字串(不包括a)。    jsonParser.nextString('a'); //  ["12345678", "87654321"],    "n(前面有兩個空格)        // 返回當前讀取位置到第一次遇到字串中(如"0089")任一字元之間的字串,同時該字元是trimmed的。(此處就是第一次遇到了89)    jsonParser.nextTo("0089"); //me" : "yuanzhifei        // 讀取位置撤銷一個    jsonParser.back();    jsonParser.next(); //i        // 讀取位置前進到指定字串處(包括字串)    jsonParser.skipPast("address");    jsonParser.next(8); //" : { "c        // 讀取位置前進到執行字元處(不包括字元)    jsonParser.skipTo('m');    jsonParser.next(8); //married"} catch (JSONException ex) {    // 異常處理代碼}

json中的null和java中的null注意:

// json對象的成員為null可能有兩種情況:// 1: 不出現該成員的名稱(對應java中的null)// 2: 成員值為null。(對應java中的JSONObject.NULL)// 完整的Json//  {  //      "phone" : ["12345678", "87654321"], // 數組  //      "name" : "yuanzhifei89", // 字串  //      "age" : 100, // 數值  //      "address" : { "country" : "china", "province" : "jiangsu" }, // 對象  //      "married" : false // 布爾值  //  }  // 第一種情況:不出現某成員的名稱(address)String jsonText = "{" +      "   \"phone\" : [\"12345678\", \"87654321\"]," +      "   \"name\" : \"yuanzhifei89\"," +      "   \"age\" : 100," +      "   \"married\" : false," +  "}"; try {    JSONTokener t = new JSONTokener(jsonText);    JSONObject obj = (JSONObject) t.nextValue();    if (obj.optJSONObject("address") == null || obj.isNull("address")) {    }} catch (JSONException ex) {    ex.printStackTrace();}// 第二種情況:成員值為null(address為null)String jsonText = "{" +      "   \"phone\" : [\"12345678\", \"87654321\"]," +      "   \"name\" : \"yuanzhifei89\"," +      "   \"age\" : 100," +      "   \"address\" : null," +      "   \"married\" : false," +  "}"; try {    JSONTokener t = new JSONTokener(jsonText);    JSONObject obj = (JSONObject) t.nextValue();        // 應該這樣判斷json是否為null    if (obj.get("address") == JSONObject.NULL || obj.isNull("address")) {    }} catch (JSONException ex) {    ex.printStackTrace();}

json中的對象不存在和java中的對應關係

json中的null對應java中的JSONObject.NULL,所以jsonObj.put("key", JSONObject.NULL) 相當於{"key" : null}json中的不出現某成員對應Java中的null,所以jsonObj.put("key", null)相當於刪除該成員,即:{}

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.