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是否為nullif (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)相當于刪除該成員,即:{}
遍歷JSONArray對象
JSONArray person = (JSONArray) jsonParser.nextValue(); // 接下來的就是JSON對象的操作了 for (int i = 0; i < person.length(); i++) { String a0 = person.getJSONObject(i).getString("ID");}