java中使用JSON工具處理數字null空
目錄
前言
作者常用的有兩個:
1. json-lib
maven引入方式:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
2. fastjson
maven引入方式:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
</dependency>
這兩個工具包都可以進行json相關的轉換等處理;當然也還有其他兩個大家熟知的工具包 Gson和jackson,這兩個其實現在都比json-lib好;Gson完全可以將複雜的物件進行正確的轉換,從功能上來說個人感覺是最好的,而jackson其實在轉換複雜物件的也同樣會存在一些問題。
1. 缺點:
json-lib:
①. 處理速度慢
②. 如果一個類裡面會出現另一個類的list或者map集合,json-lib從json到bean的轉換就會出現問題
③.依賴於很多第三方包:commons-lang-2.6,commons-beanutils,commons-collections-3.2,commons-logging-1.1.1,ezmorph-1.0.6
fastjson:
①. 複雜型別的Bean轉換Json上會出現一些問題,可能會出現引用的型別,導致Json轉換出錯,需要制定引用
②. 日期的處理有bug
2. 優點:
json-lib:
對於目前網際網路應用來說,其實個人感覺沒啥優點了。
fastjson:
①.採用獨創的演算法,速度快(其實也正因為這個,內部處理不完善,才會出現日期等轉換的缺陷)
②. 無依賴,可直接在JDK執行
3.差異區別:
物件轉為json的時候:
net.sf.json 工具包使用 JSONObject.fromObject(obj)。
fastjson 工具包使用JSONObject.parseObject(str)。
json轉物件的時候:
net.sf.json 工具包使用 JSONObject.toBean(obj) 與 JSONObject.toBean(obj, class)。
fastjson 工具包使用JSONObject.toJavaObject(json, class) 與JSONObject.parseObject(str, class)。
fastjson還可以使用 toJSONString將物件轉換為String字串
4. 處理物件中的空null:
net.sf.json工具包會將字串型別轉換為JSONNull格式的null,將數字型別轉換為0 與 0.0。
fastjson 工具包會從結果中直接排除為空null的物件屬性
5. 分別解決物件中的空null:
net.sf.json工具包:
可以定義一個靜態常量,JSONConfig,作為fromObject方法的第二個入參(主要針對數字):
//定義
public static final JsonConfig jsonConfig = new JsonConfig();
static {
jsonConfig.registerDefaultValueProcessor(Number.class, new DefaultDefaultValueProcessor() {
@Override
public Object getDefaultValue(Class type) {
return null;
}
});
}
//使用
JSONObject.fromObject(obj, jsonConfig)
注意:此處可自定義要將空null處理成什麼,如果null則返回的不是null,而是JSONNull,如果要判斷是否為空需要使用ObjectUtils.isnull()方法判斷或者使用getString得到"null"字串進行判斷。
fastjson 工具包:
在轉成json字串的時候,增加入參,SerializerFeature.WriteMapNullValue,這樣轉換後,的結果中就不會排除為空null的物件的屬性,
JSON.parseObject(JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue), class)
此包不存在net.sf.json包的JSONNull的問題。但是對日期的處理有部分缺陷;不過對於日常普通使用是不會有影響的。