網站開發中,大家經常使用ajax請求返回json數據到前臺給js使用,但是對於java中long類型的數據,如果通過json傳遞到前臺js中時,由於js的精度不夠,會造成long類型的數據丟失後面幾位。所以在返回前臺json數據時,我們需要把long類型的數據轉成string類型的數據,這樣就可以在js中丟失精度。還有java中Date類型的日期,我們需要返回json時,按照自己的日期格式就Date類型的數據轉成string類型數據傳遞給前臺,這就需要我們覆蓋實現jackson包中的ObjectMapper類,然後根據類型判斷,覆蓋父類中的默認處理方法,從而達到自己自定義實現方式。代碼如下
package com.jd.trial.common.json;
import java.io.IOException;
import java.util.Date;
import com.jd.trial.common.utils.DateTools;
import org.codehaus.jackson.JsonGenerator;
import org.codehaus.jackson.JsonProcessingException;
import org.codehaus.jackson.map.JsonSerializer;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.SerializerProvider;
import org.codehaus.jackson.map.ser.CustomSerializerFactory;
/**
* 自定義處理json對象內數據格式
*
* @ClassName: JdObjectMapper
* @author ***
* @date 2014年12月18日 上午9:21:54
*
*/
public class JdObjectMapper extends ObjectMapper {
public JdObjectMapper() {
CustomSerializerFactory factory = new CustomSerializerFactory();
// 格式化日期
factory.addGenericMapping(Date.class, new JsonSerializer<Date>() {
@Override
public void serialize(Date value, JsonGenerator jsonGenerator,
SerializerProvider provider) throws IOException,
JsonProcessingException {
jsonGenerator.writeString(DateTools.format(value));
}
});
// Long轉換爲String
factory.addGenericMapping(Long.class, new JsonSerializer<Long>() {
@Override
public void serialize(Long value, JsonGenerator jgen,
SerializerProvider provider) throws IOException,
JsonProcessingException {
jgen.writeString(String.valueOf(value));
}
});
this.setSerializerFactory(factory);
}
}
自定義類實現完了,然後需要在spring-servlert.xml中進行註冊,方可生效,
<!-- 處理json格式 -->
<bean id="jdObjectMapper" class="com.jd.trial.common.json.JdObjectMapper"/>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
<bean
class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
<property name="objectMapper" ref="jdObjectMapper"></property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
通過以上兩步操作,即可實現返回json數據中的類型自定義處理。