springmvc--json--返回json的日期格式問題


(一)輸出json數據

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

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數據,比如:

復制代碼
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的日期格式化。

我第一次嘗試總是失敗,后來添加完整的依賴包后成功,需要添加如下幾個依賴:

復制代碼
 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自動生成實體類會覆蓋。

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

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

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

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字段需要精簡,只能在顯示層裁剪。

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

 

So do it,and change it,no regret!
 
文轉/@http://www.cnblogs.com/woshimrf/p/5189435.html
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM