springmvc中使用jackson-mapper-asl便可進行json輸出,在配置上有幾點:java
1 <dependency> 2 <groupId>org.codehaus.jackson</groupId> 3 <artifactId>jackson-mapper-asl</artifactId> 4 <version>${jackson.version}</version> 5 </dependency>
mvc:annotation-driven默認加載了json轉換器,咱們添加了上面的依賴包後就可使用註解@ResponseBody來返回json數據,好比:spring
1 @RequestMapping("json") 2 @ResponseBody 3 public List<User> userList(ModelMap modelMap){ 4 UserExample example = new UserExample(); 5 example.createCriteria().andUsernameIsNotNull(); 6 List<User> users = userMapper.selectByExample(example); 7 return users; 8 }
上面雖然輸出了json,但json的date類型的屬性都是long值,像在頁面取出是國外的日期格式同樣,咱們須要加一個格式轉換,將日期的格式轉換成想要的格式:yyyy-MM-dd。數據庫
在實體類的getter方法上面添加@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") 就能夠將json的日期格式化。json
我第一次嘗試老是失敗,後來添加完整的依賴包後成功,須要添加以下幾個依賴:mybatis
1 <!-- json數據 --> 2 <dependency> 3 <groupId>org.codehaus.jackson</groupId> 4 <artifactId>jackson-mapper-asl</artifactId> 5 <version>${jackson.version}</version> 6 </dependency> 7 <dependency> 8 <groupId>com.fasterxml.jackson.core</groupId> 9 <artifactId>jackson-core</artifactId> 10 <version>${jackson.core.version}</version> 11 </dependency> 12 <dependency> 13 <groupId>com.fasterxml.jackson.core</groupId> 14 <artifactId>jackson-databind</artifactId> 15 <version>${jackson.core.version}</version> 16 </dependency> 17 18 19 <properties> 20 <jackson.version>1.9.13</jackson.version> 21 <jackson.core.version>2.4.2</jackson.core.version> 22 </properties>
優勢是簡單方便,缺點是須要在每一個須要的屬性的getter方法上面添加。宏觀的看比較繁瑣,但實際開發中也就一行代碼的事情,惟一很差的是mybatis自動生成實體類會覆蓋。mvc
參考:http://aokunsang.iteye.com/blog/1878985app
在上面的方法中雖然簡單方便,但缺點也很明顯,自動生成代碼會覆蓋實體類,並且每一個日期屬性都要手動添加,實際中日期屬性又是廣泛必備。所以,大可全局處理,統一格式。這裏須要說下,在數據庫中的date和timestamp都會被mybatis轉換成date對象。至於生日精確到日、時間精確到到秒的格式規範可讓顯示層作處理。統一成yyyy-MM-dd HH:mm:sside
MappingJacksonHttpMessageConverter主要經過ObjectMapper來實現返回json字符串。這裏咱們繼承該類,註冊一個JsonSerializer<T>。而後在配置文件中注入自定義的ObjectMapper。工具
1 package com.demo.common.util.converter; 2 3 import org.codehaus.jackson.JsonGenerator; 4 import org.codehaus.jackson.JsonProcessingException; 5 import org.codehaus.jackson.map.JsonSerializer; 6 import org.codehaus.jackson.map.ObjectMapper; 7 import org.codehaus.jackson.map.SerializerProvider; 8 import org.codehaus.jackson.map.ser.CustomSerializerFactory; 9 10 import java.io.IOException; 11 import java.text.SimpleDateFormat; 12 import java.util.Date; 13 14 /** 15 * 解決Date類型返回json格式爲自定義格式 16 * Created by Administrator on 2016/2/14. 17 */ 18 public class CustomJsonDateConverter extends ObjectMapper { 19 public CustomJsonDateConverter(){ 20 CustomSerializerFactory factory = new CustomSerializerFactory(); 21 factory.addGenericMapping(Date.class, new JsonSerializer<Date>(){ 22 @Override 23 public void serialize(Date value, 24 JsonGenerator jsonGenerator, 25 SerializerProvider provider) 26 throws IOException { 27 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 28 jsonGenerator.writeString(sdf.format(value)); 29 } 30 }); 31 this.setSerializerFactory(factory); 32 } 33 }
1 <mvc:annotation-driven> 2 <mvc:message-converters> 3 <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 4 <property name="objectMapper" ref="customObjectMapper"></property> 5 </bean> 6 </mvc:message-converters> 7 </mvc:annotation-driven> 8 <bean id="customObjectMapper" class="com.demo.common.util.converter.CustomJsonDateConverter"></bean>
這個配置沒法和上一個@JsonFormat共同使用。因爲全局統一了日期格式,date和datetime以及timestamp都是一個格式,若是生日等date字段須要精簡,只能在顯示層裁剪。this
一樣是全局設置json響應的日期格式,但此方法能夠和@JsonFormat共存,也就是說能夠全局設置一個格式,特定的需求可使用註解設置。
<mvc:annotation-driven> <!-- 處理responseBody 裏面日期類型 --> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
@JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8") public Date getBirth() { return birth; }