因爲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 它是返回空, 不出異常.