深入Android 原生JSON解析(JSONObject/JSONArray)解析教程以及細節剖析

今天是1024了,祝大家程序猿節快樂(ps:工作三年了)

 

 

 

早些時候 移動互聯網剛剛興起的時候,傳輸數據是通過XML,然後判斷XML的Nood節點,易出錯,

解析XML有三種:

SAX

SAX(Simple API for XML)是一個解析速度快並且佔用內存少的XML解析器,非常適合用於Android等移動設備。SAX解析XML文件採用的是事件驅動,也就是說,它並不需要解析完整個文檔,在按內容順序解析文檔的過程中,SAX會判斷當前讀到的字符是否合法XML語法中的某部分,如果符合就會觸發事件。所謂事件,其實就是一些回調(callback)方法,這些方法(事件)定義在ContentHandler接口。

Pull解析器:

  Pull解析是一個while循環,隨時可以跳出。Pull解析器的工作方式爲允許你的應用程序代碼主動從解析器中獲取事件,因此可以在滿足了需要的條件後不再獲取事件,結束解析工作。

 

DOM解析:

  DOM解析XML文件時,會將XML的所有內容讀取到內存中,然後允許您使用DOM API遍歷XML樹、檢索所需的數據。因爲DOM需要將所有內容讀取到內存中,所以內存的消耗比較大,不建議使用DOM解析XML文件,若文件較小可行。

 

XML和JSON對比,XML體積更龐大,會有一些無用的Nood點<xml...><...> 傳輸和發送數據很佔用帶寬和內存

 

而JSON應運而生:

{"state":false,"message":"no","data":"0"} 體積小 效率高 易讀等

解析JSON的框架有

GSON //Google的

FastJson //阿里巴巴

其他的不常用

原生解析是通過JSONObject

 

jsonObject = new JSONObject(data);

獲取數據首先建立bean類

然後通過getString()/getInt/getDouble或者optString / optDouble等

 

opt和get的區別是:

get:如果結果字段不存在會拋出一個異常 可能導致程序carsh

/**
 * Returns the value mapped by {@code name} if it exists, coercing it if
 * necessary, or throws if no such mapping exists.
 *
 * @throws JSONException if no such mapping exists.
 */
public String getString(String name) throws JSONException {
    Object object = get(name);
    String result = JSON.toString(object);
    if (result == null) {
        throw JSON.typeMismatch(name, object, "String");
    }
    return result;
}

 

opt:如果字段不存在會有個default值

/**
 * Returns the value mapped by {@code name} if it exists, coercing it if
 * necessary, or the empty string if no such mapping exists.
 */
public String optString(String name) {
    return optString(name, "");
}

調用

/**
 * Returns the value mapped by {@code name} if it exists, coercing it if
 * necessary, or {@code fallback} if no such mapping exists.
 */
public String optString(String name, String fallback) {
    Object object = opt(name);
    String result = JSON.toString(object);
    return result != null ? result : fallback;
}

 

如果JSON裏面有對象:

可以通過jsonObj.optJSONObject("name");返回一個JSONObject

如果有數組就是optJsonArray(name);

遍歷

for (int i = 0; i < jsonArray.length(); i++) {
    //每一條都是JSONObject對象
     JSONObject tempJson = jsonArray.optJSONObject(i);
  //把數據保存到Bean裏添加到集合
}

如果返回的JSON有轉義字符如\ ,需要將該字段的數據通過String name = json.optString(name);然後JSONObject j1 = new JSONObject(name );

保存數據示例:

data.setTitle(jsonData.optString("Title"));
data.setId(jsonData.optString("Id"));
data.setUid(jsonData.optString("Uid"));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章