springmvc學習筆記--json--返回json的日期格式問題

(一)輸出json數據

springmvc中使用jackson-mapper-asl便可進行json輸出,在配置上有幾點:java

1.使用mvc:annotation-driven

2.在依賴管理中添加jackson-mapper-asl

1 <dependency>
2         <groupId>org.codehaus.jackson</groupId>
3         <artifactId>jackson-mapper-asl</artifactId>
4         <version>${jackson.version}</version>
5 </dependency>

3.使用註解@ResponseBody

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,但json的date類型的屬性都是long值,像在頁面取出是國外的日期格式同樣,咱們須要加一個格式轉換,將日期的格式轉換成想要的格式:yyyy-MM-dd。數據庫

1.使用@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")

在實體類的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

2.繼承ObjectMapper來實現返回json字符串

參考:http://aokunsang.iteye.com/blog/1878985app

在上面的方法中雖然簡單方便,但缺點也很明顯,自動生成代碼會覆蓋實體類,並且每一個日期屬性都要手動添加,實際中日期屬性又是廣泛必備。所以,大可全局處理,統一格式。這裏須要說下,在數據庫中的date和timestamp都會被mybatis轉換成date對象。至於生日精確到日、時間精確到到秒的格式規範可讓顯示層作處理。統一成yyyy-MM-dd HH:mm:sside

MappingJacksonHttpMessageConverter主要經過ObjectMapper來實現返回json字符串。這裏咱們繼承該類,註冊一個JsonSerializer<T>。而後在配置文件中注入自定義的ObjectMapper。工具

2.1編寫子類繼承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 }

2.2配置spring文件

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>

 2.3顯示層自主決定日期類型長度

這個配置沒法和上一個@JsonFormat共同使用。因爲全局統一了日期格式,date和datetime以及timestamp都是一個格式,若是生日等date字段須要精簡,只能在顯示層裁剪。this

3.使用內置的日期格式化工具

一樣是全局設置json響應的日期格式,但此方法能夠和@JsonFormat共存,也就是說能夠全局設置一個格式,特定的需求可使用註解設置。

3.1配置spring文件

<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>

3.2配置特定的date

 @JsonFormat(pattern="yyyy-MM-dd",timezone = "GMT+8")
    public Date getBirth() {
        return birth;
    }

3.3最終

相關文章
相關標籤/搜索