為什么要使用Fastjson
我們能用fastjson來作什么?
1、替換其他所有的json庫,java世界里沒有其他的json庫能夠和fastjson可相比了。
2、使用fastjson的序列化和反序列化替換java serialize,java serialize不單性能慢,而且體制大。
3、使用fastjson替換hessian,json協議和hessian協議大小差不多一樣,而且fastjson性能優越,10倍于hessian
4、把fastjson用于memached緩存對象數據。
Jackson在處理對象之前的循環嵌套關系時不便。
什么是對象間的循環嵌套?比如A有一個List,B對象里又有一個A對象,當然返回A對象的Json字符串時,如果是
Jackson就會發生異常,因為Jackson天生不具備處理這種關系的能力,而Fastjson正好具備了這種能力
(另,如果你用的是 Jackson,可以使用相應的注解來支持對象間的循環嵌套,具體是什么注解忘了,你可以Google一下Jackson循環嵌套就有很多答案)。]
springMVC使用fastJson很簡單:
第一種:在springMVC的配置文件中作如下配置:
<!-- 啟用默認配置 -->
<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,版本可以切換至最新版本,可使用如下設置(強烈建議使用Maven
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.7</version>
</dependency>
當屬性值為空的時候,fastjson默認是不輸出的,
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);
//輸出結果:{"a":1,"b":"",d:"zhenghuasheng"}
從輸出結果可以看出,null對應的key已經被過濾掉;這明顯不是我們想要的結果,這時我們就需要用到fastjson的SerializerFeature序列化屬性
也就是這個方法:JSONObject.toJSONString(Object object, SerializerFeature... features)
Fastjson的SerializerFeature序列化屬性:
QuoteFieldNames———-輸出key時是否使用雙引號,默認為true
WriteMapNullValue——–是否輸出值為null的字段,默認為false
WriteNullNumberAsZero—-數值字段如果為null,輸出為0,而非null
WriteNullListAsEmpty—–List字段如果為null,輸出為[],而非null
WriteNullStringAsEmpty—字符類型字段如果為null,輸出為”“,而非null
-
WriteNullBooleanAsFalse–Boolean字段如果為null,輸出為false,而非null
<!-- 輸出key時是否使用雙引號 --> <value>QuoteFieldNames</value> <!-- 是否輸出值為null的字段 --> <!-- <value>WriteMapNullValue</value> --> <!-- 數值字段如果為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的日期轉換器 --> <value>WriteDateUseDateFormat</value> </list>
第二種直接使用
@RequestMapping(value="/page/query", method=RequestMethod.POST)
@ResponseBody
public String queryQua(HttpServletRequest request, HttpServletResponse response) throws Exception{
SerializeConfig seriConf = new SerializeConfig();
seriConf.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss"));
Map<String,String> params = Request2MapUtil.wrapMap(request) ;
User user = LoginUserUtil.getCurrentUser(request, response);
params.put("userName",user.getUsername());
int page = params.get("page") == null ? 1 : Integer.parseInt(params.get("page").toString());
int limit = params.get("limit") == null ? 10 : Integer.parseInt(params.get("limit").toString());
PageInfo pageInfo = customerService.queryCustomerList(params, limit, page);
PageResult result = new PageResult(PageResult.SUCCESS, pageInfo.getTotal(), pageInfo.getList());
return JSON.toJSONString(result, seriConf,SerializerFeature.WriteNullStringAsEmpty, SerializerFeature.WriteMapNullValue);
}