一直使用的是FastJson,感覺還不錯,很方便。看了一段別人的分析,覺得很有道理。
為什么要使用Fastjson,其實原因不需要太多,喜歡就行。
我之所以要替換掉Jackson最主要的原因是Jackson在處理對象之前的循環(huán)嵌套關(guān)系時不便。
ps:什么是對象間的循環(huán)嵌套?比如A有一個List,B對象里又有一個A對象,當(dāng)然返回A對象的Json字符串時,如果是
Jackson就會發(fā)生異常,因為Jackson天生不具備處理這種關(guān)系的能力,而Fastjson正好具備了這種能力(另,如果你用的是
Jackson,可以使用相應(yīng)的注解來支持對象間的循環(huán)嵌套,具體是什么注解忘了,你可以Google一下Jackson循環(huán)嵌套就有很多答案)。]
springMVC使用fastJson很簡單,在springMVC的配置文件中作如下配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
``` <!-- 啟用默認(rèn)配置 --> < mvc:annotation-driven > < mvc:message-converters register-defaults = "true" > <!-- 配置Fastjson支持 --> < bean class = "com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter" > < property name = "supportedMediaTypes" > < list > < value >text/html;charset=UTF-8</ value > < value >application/json</ value > </ list > </ property > < property name = "features" > < list > < value >WriteMapNullValue</ value > < value >QuoteFieldNames</ value > </ list > </ property > </ bean > </ mvc:message-converters > </ mvc:annotation-driven > |
別忘了添加Fastjson的包,如果使用Maven,版本可以切換至最新版本,可使用如下設(shè)置(強烈建議使用Maven
1
2
3
4
5
|
< dependency > < groupId >com.alibaba</ groupId > < artifactId >fastjson</ artifactId > < version >1.2.7</ version > </ dependency > |
當(dāng)屬性值為空的時候,fastjson默認(rèn)是不輸出的,
1
2
3
4
5
6
7
8
9
|
Map < String , Object > jsonMap = new HashMap< String , Object>(); jsonMap.put( "a" , 1 ); jsonMap.put( "b" , "" ); jsonMap.put( "c" , null ); jsonMap.put( "d" , "zhenghuasheng" ); String str = JSONObject.toJSONString(jsonMap); System.out.println(str); //輸出結(jié)果:{"a":1,"b":"",d:"zhenghuasheng"} |
從輸出結(jié)果可以看出,null對應(yīng)的key已經(jīng)被過濾掉;這明顯不是我們想要的結(jié)果,這時我們就需要用到fastjson的SerializerFeature序列化屬性
也就是這個方法:JSONObject.toJSONString(Object object, SerializerFeature... features)
Fastjson的SerializerFeature序列化屬性:
- QuoteFieldNames———-輸出key時是否使用雙引號,默認(rèn)為true
- WriteMapNullValue——–是否輸出值為null的字段,默認(rèn)為false
- WriteNullNumberAsZero—-數(shù)值字段如果為null,輸出為0,而非null
- WriteNullListAsEmpty—–List字段如果為null,輸出為[],而非null
- WriteNullStringAsEmpty—字符類型字段如果為null,輸出為”“,而非null
- WriteNullBooleanAsFalse–Boolean字段如果為null,輸出為false,而非null
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
<!-- 輸出key時是否使用雙引號 --> < value >QuoteFieldNames</ value > <!-- 是否輸出值為null的字段 --> <!-- <value>WriteMapNullValue</value> --> <!-- 數(shù)值字段如果為null,輸出為0,而非null --> < value >WriteNullNumberAsZero</ value > <!-- List字段如果為null,輸出為[],而非null --> < value >WriteNullListAsEmpty</ value > <!-- 字符類型字段如果為null,輸出為"",而非null --> < value >WriteNullStringAsEmpty</ value > <!-- Boolean字段如果為null,輸出為false,而非null --> < value >WriteNullBooleanAsFalse</ value > <!-- null String不輸出 --> < value >WriteNullStringAsEmpty</ value > <!-- null String也要輸出 --> <!-- <value>WriteMapNullValue</value> --> <!-- Date的日期轉(zhuǎn)換器 --> < value >WriteDateUseDateFormat</ value > </ list > |
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://blog.csdn.net/zhenghuasheng/article/details/51223106