net.sf.json.JSONObject 獲取指定類型數據, 不應該異常處理

因爲xml太複雜, 所以現在簡單的服務 都用json傳送, 性能高,容量小, 速度快. 現在不管是阿里的雲, 還是企鵝的微信支付 都是這樣.

現在流行的json解釋包有幾種, 阿里的, net.sf, org的, 因爲代碼裏都用過, 所以來吐下net.sf的煩之處: 異常.

看下面代碼:

package com.test;

import net.sf.json.JSONObject;

public class DemoJson {

	public static void main(String[] args) {
		String jsonStr = "{\"bzRate\":\"99.4\",\"goodQtyz\":\"1100\",\"gxRate\":\"99.64\",\"tranDate\":\"2019061301\",\"workQtyz\":\"1104\"}";
		JSONObject jsonObj = JSONObject.fromObject(jsonStr);
		
		//正常讀取對象, 沒有返回 null, 不產生異常
		Object tranDate = jsonObj.get("tranDate");
		Object tranDate2 = jsonObj.get("tranDate2");
		//結果: tranDate = 2019061301, tranDate2 = null
		System.out.println("tranDate = "+tranDate +", tranDate2 = "+tranDate2);
		
		//按類型讀取, 因爲tranDate2 沒有, 則產生異常, 這一點不敢同意 net.sf 大師的寫法: 正確的方式應返加  null 對象
		String tranDateStr = jsonObj.getString("tranDate");
		String tranDateStr2 = jsonObj.getString("tranDate2");
		//結果: 異常
		System.out.println("tranDateStr = "+tranDateStr +", tranDateStr2 = "+tranDateStr2);
	}

}

在上面的代碼中, get(XXX) 結果是Object 不產生異常, 如果名稱沒填寫對, 返回空, 正常來說這樣很好的.

但是, 如果要按類型獲取, 比如獲取String類型的數據, 如果名稱填寫錯誤了, 它不是返回空, 而是產生代碼異常, 中斷程序運行!!

異常如下:

Exception in thread "main" tranDate = 2019061301, tranDate2 = null
net.sf.json.JSONException: JSONObject["tranDate2"] not found.
	at net.sf.json.JSONObject.getString(JSONObject.java:2092)
	at com.wasion.ems.interfaces.hnwskjy.test.DemoJson.main(DemoJson.java:19)

個人非常不同意這樣的做法, 取 Object 沒有返回空, 爲什麼取 String 沒有不返回空? String 也是對象, 爲什麼要異常? 其它類:

//取Integer, 
		Integer workQtyz = jsonObj.getInt("workQtyz");
		Integer workQtyz2 = jsonObj.getInt("workQtyz2");//這裏會異常
		//
		System.out.println("workQtyz = "+workQtyz +", workQtyz2 = "+workQtyz2);

不認可的理由:

1, 從設計上來說, Object 與 String, Integer 都是對象, 應當採用一樣的處理方式.

2,取String, Integer只不過是從 Object 轉換判斷一下而已, 空就返回空對象, 不應當給出異常.

3, 這只是個處理 Json 工具類, 只是取值, 又不是無法處理, 你搞個異常出來, 大家每一行代碼都好麻煩的.

建議大家改用: 阿里的包 com.alibaba.fastjson.JSON 它是返回空, 不出異常.

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