天天看點

Android關于json資料的處理JSONObject、Gson、FastJson、Jackson

當我剛接觸Android的時候,還很稚嫩,社交經驗也幾乎為零,還是前輩們說啥我幹啥,是以跟着前輩們用JSONObject。想必有一些後起之秀應該都沒用過,因為大部分都是沉浸在使用第三方無法自拔,的确第三方極大的減少我們的開發時間,也省去改bug的時間。但是倔強的我個人還是認為,會創造比會用更好,當然我也是個菜鳥創造不出什麼花兒來,但我的項目堅持能不用第三方就不用,這是題外話,哈哈。

轉載注明出處,CSDN第四篇

現在的時間是11月底,如果我數學馬馬虎虎就應該說這是本月最後一個周末了。我也來新公司算是一個月了,關于老項目的優化也接近瓶頸(本來想說尾聲的…),為啥說是瓶頸呢,應該是我能優化的都優化了,如果還有沒優化的那就是我還沒發現。

話鋒一轉,下面說一下關于json的處理。

用JSONObject處理json資料

@Override
    public void onSuccess(String result) {
		try {
            JSONObject object=new JSONObject(result);
            String name=object.getString("name");
            int age=object.getInt("age");
            boolean status=object.getBoolean("status");
            JSONArray data=object.getJSONArray("data");
            JSONObject item=data.getJSONObject(0);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }
           

這就是我最早時候接觸的處理資料,說實話也沒什麼不好,用的時候再取就好了,而且String和JSONObejct互轉也很友善,傳遞資料的時候,直接換成String類型的json傳。

用Gson處理json資料

這個就比較常見了,自從我用了之後幾乎幾年都沒換過,唯一的缺點就是資料和bean必須一模一樣,否則報錯。随着時代的發展,越來越不适應了。

@Override
    public void onSuccess(String result) {
		Gson gson = new Gson();
		Bean bean = gson.fromJson(result, Bean.class);
		ArrayList<Bean> list = gson.fromJson(gsonString, new TypeToken<ArrayList<Bean>>() {}.getType());
		Map<String, Bean> map = gson.fromJson(gsonString, new TypeToken<Map<String, Bean>>() {}.getType());
    }
           

上面代碼可以看出轉成list和map的時候也略微複雜。

用FastJson處理json資料

@Override
    public void onSuccess(String result) {
		Bean bean = JSON.parseObject(result, Bean .class);
		JSONArray array = JSON.parseArray(result);
		List<Bean> beans= JSON.parseArray(result, Bean.class);
		List<Bean > listMap = JSON.parseObject(result,new TypeReference<List<Bean >(){});
		List<Map<String,Bean>> listMap = JSON.parseObject(result,new TypeReference<List<Map<String,Bean>>(){});
		Map<String,Bean> map = JSON.parseObject(result,new TypeReference<Map<String,Bean>(){});
    }
           

可以看出fastJson轉換的時候要友善的多,并且速度特别快。當然也有缺點就是出bug比較多,具體什麼bug我沒遇到過,隻是測試了一下用法。

用Jackson處理json資料

@Override
    public void onSuccess(String result) {
    	ObjectMapper objectMapper = new ObjectMapper();
		Bean bean = objectMapper.readValue(result, Bean .class);
		List<Bean> beans= JSON.parseArray(result, new TypeReference<List<Bean>>() {});
		Map<String,Bean> map = objectMapper.readValue(result, Map.class);
    }
           

小結

總體來說大同小異,國外比較喜歡用Jackson,國内比較推薦FastJson,而用的比較多的是Gson。但是我在這裡反而要推薦返璞歸真,使用JSONObject,這是為什麼呢?

首先省去實體類的代碼量,其次省去bean和資料不對應取不出資料的問題,即使背景加一個參數,我們解析依然不報錯,有很大的健壯性。

//此處封裝在請求網絡接口之後
 	@Override
    public void onResponse(final Response response, callback) {
    	try {
            sendSuccessResultCallback(response.request(), response.body().string(), callback);
        } catch (IOException e) {
            sendFailedStringCallback(response.request(), e, callback);
        }
    }
    private void sendSuccessResultCallback(final Request request, final String response, final ResultCallback callback) {
    	int code;
    	String result= "";
    	JSONObject o = null;
        JSONArray a = null;
        try {
             JSONObject json = new JSONObject(response);
             code = json.optInt("code");
             msg = json.optString("message");
             result= json.optString("body");
             if (!TextUtils.isEmpty(data)) {
                 Object object = new JSONTokener(data).nextValue();
	             if (object instanceof JSONObject) {
	                 JSONObject obj = (JSONObject) object;
	                 o = obj;
	             } else if (object instanceof JSONArray) {
	                 JSONArray array = (JSONArray) object;
	                 a = array;
	             }
	          }
           } catch (JSONException e) {
           }
           if (o == null) {
              o = new JSONObject();
           }
           if (a == null) {
              a = new JSONArray();
           }
           callback.onSuccess(code,result, o, a);
    }
 	@Override
    public void onSuccess(int code,String result, JSONObject object, JSONArray array) {
    	  //注意這裡的object和array都不會為空,如果背景資料是{}就直接用object,如果是[]就用array
    	  String name=object.optString("name");
          int age=object.optInt("age");
          boolean status=object.optBoolean("status");
          //上面使用opt去取值,如果沒有也會預設為0,"",false等,不會報錯
          JSONArray data=object.optJSONArray("data");
          if (data== null) {
              data = new JSONArray();
           }
          JSONObject item=data.optJSONObject(0);
          if (item== null) {
              item= new JSONObject();
          }
          //這裡會為空是以直接建立一個空資料
    }
           

總結

其實我有點标題黨,因為我主要是宣傳JSONObject的用法,哈哈。

當然如果我下一次用,我會選擇Jackson,比Gson快,比FastJson穩定,比JSONObject簡潔。