1. 程式人生 > >Spring MVC JSON 實現JsonSerializer Date型別轉換

Spring MVC JSON 實現JsonSerializer Date型別轉換

在Spring MVC中存在兩大類的型別轉換,一類是Json,一個是Spring的Binder轉換。

JSON:

使用Json轉換時,可以如下使用:

 public class Test {  
          
        private Date createdate;  
      
        @JsonSerialize(using = DateYMDHMSJsonSerializer.class)  
        public Date getCreatedate() {  
            return createdate;  
        }  
      
        @JsonDeserialize(using = DateYMDHMSJsonDeserializer.class)  
        public void setCreatedate(Date createdate) {  
            this.createdate = createdate;  
        }  
    }  


可以看到這裡使用了兩個Json轉換的註解:

第一個@JsonSerialize是轉換為字串,主要是後臺傳遞給前臺時的日期格式;

第二個@JsonDeserialize是轉換字串為日期型別,主要是從前臺往後臺傳遞時的日期。

兩個具體轉換類的實現:

    /** 
     * Description: 日期轉換 - "yyyy-MM-dd HH:mm:ss" 
     * Author: liuzh 
     * Update: liuzh(2014-04-17 10:59) 
     */  
    public class DateYMDHMSJsonSerializer extends JsonSerializer<Date>{  
        @Override  
        public void serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {  
            try {  
                jsonGenerator.writeString(DateUtil.formatDate(date, DateUtil.DATE_FORMAT_TIME_T));  
            } catch (BusinessException e) {  
                jsonGenerator.writeString(String.valueOf(date.getTime()));  
            }  
        }  
    }  

    /** 
     * Description: 日期轉換 - "yyyy-MM-dd HH:mm:ss" 
     * Author: liuzh 
     * Update: liuzh(2014-04-17 10:59) 
     */  
    public class DateYMDHMSJsonDeserializer extends JsonDeserializer<Date> {  
        @Override  
        public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {  
            try {  
                return DateUtil.formatStringToDate(jp.getText(), DateUtil.DATE_FORMAT_TIME_T);  
            } catch (BusinessException e) {  
                return new Date(jp.getLongValue());  
            }  
        }  
    }  

其中DateUtil是一個對日期格式轉換的工具類,使用的SimpleDateFormat進行轉換。

Binder:

這種型別轉換的時候,使用的是Spring的引數繫結,程式碼如下:

    /** 
     * Description: 全域性型別轉換 
     * Author: liuzh 
     * Update: liuzh(2014-05-26 13:08) 
     */  
    public class GlobalDataBinder implements WebBindingInitializer {  
        /** 
         * 智慧日期轉換,針對四種格式日期: 
         * 1.2014-05-26 
         * 2.1401951570548 
         * 3.2014-05-26 00:00 
         * 4.2014-05-26 00:00:00 
         */  
        private class SmartDateEditor extends PropertyEditorSupport {  
            /** 
             * 根據2014-05-26 00:00:00長度來判斷選擇哪種轉換方式 
             */  
            @Override  
            public void setAsText(String text) throws IllegalArgumentException {  
                if (text == null || text.length() == 0) {  
                    setValue(null);  
                } else {  
                    try {  
                        if (text.length() == 10) {  
                            setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_YYYYMMDD));  
                        } else if (text.length() == 13) {  
                            setValue(new Date(Long.parseLong(text)));  
                        } else if (text.length() == 16) {  
                            setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_TIME_R));  
                        } else if (text.length() == 19) {  
                            setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_TIME_T));  
                        } else {  
                            throw new IllegalArgumentException("轉換日期失敗: 日期長度不符合要求!");  
                        }  
                    } catch (Exception ex) {  
                        throw new IllegalArgumentException("轉換日期失敗: " + ex.getMessage(), ex);  
                    }  
                }  
            }  
      
            /** 
             * 轉換為日期字串 
             */  
            @Override  
            public String getAsText() {  
                Date value = (Date) getValue();  
                String dateStr = null;  
                if (value == null) {  
                    return "";  
                } else {  
                    try {  
                        dateStr = DateUtil.formatDate(value, DateUtil.DATE_FORMAT_TIME_T);  
                        if (dateStr.endsWith(" 00:00:00")) {  
                            dateStr = dateStr.substring(0, 10);  
                        } else if (dateStr.endsWith(":00")) {  
                            dateStr = dateStr.substring(0, 16);  
                        }  
                        return dateStr;  
                    } catch (Exception ex) {  
                        throw new IllegalArgumentException("轉換日期失敗: " + ex.getMessage(), ex);  
                    }  
                }  
            }  
        }  
      
        @Override  
        public void initBinder(WebDataBinder binder, WebRequest request) {  
            //日期格式轉換  
            binder.registerCustomEditor(Date.class, new SmartDateEditor());  
        }  
      
    }  

這裡對日期型別進行了一些判斷來特殊處理。該類需要在Spring的xml進行配置:
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  
        <property name="webBindingInitializer">  
          <bean class="com.easternie.sys.common.GlobalDataBinder"/>  
        </property>  
    </bean>  

通過這種配置之後,Spring就能對日期進行自由轉換了。