1. 程式人生 > >Spring MVC JSON自定義型別轉換

Spring MVC JSON自定義型別轉換

型別有很多,這裡只用日期為例說明。

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

JSON:

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

  1. publicclass Test {  
  2.     private Date createdate;  
  3.     @JsonSerialize(using = DateYMDHMSJsonSerializer.class)  
  4.     public Date getCreatedate() {  
  5.         return createdate;  
  6.     }  
  7.     @JsonDeserialize
    (using = DateYMDHMSJsonDeserializer.class)  
  8.     publicvoid setCreatedate(Date createdate) {  
  9.         this.createdate = createdate;  
  10.     }  
  11. }  

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

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

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

兩個具體轉換類的實現:

  1. /** 
  2.  * Description: 日期轉換 - "yyyy-MM-dd HH:mm:ss"
     
  3.  * Author: liuzh 
  4.  * Update: liuzh(2014-04-17 10:59) 
  5.  */
  6. publicclass DateYMDHMSJsonSerializer extends JsonSerializer<Date>{  
  7.     @Override
  8.     publicvoid serialize(Date date, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {  
  9.         try
     {  
  10.             jsonGenerator.writeString(DateUtil.formatDate(date, DateUtil.DATE_FORMAT_TIME_T));  
  11.         } catch (BusinessException e) {  
  12.             jsonGenerator.writeString(String.valueOf(date.getTime()));  
  13.         }  
  14.     }  
  15. }  

  1. /** 
  2.  * Description: 日期轉換 - "yyyy-MM-dd HH:mm:ss" 
  3.  * Author: liuzh 
  4.  * Update: liuzh(2014-04-17 10:59) 
  5.  */
  6. publicclass DateYMDHMSJsonDeserializer extends JsonDeserializer<Date> {  
  7.     @Override
  8.     public Date deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {  
  9.         try {  
  10.             return DateUtil.formatStringToDate(jp.getText(), DateUtil.DATE_FORMAT_TIME_T);  
  11.         } catch (BusinessException e) {  
  12.             returnnew Date(jp.getLongValue());  
  13.         }  
  14.     }  
  15. }  

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

Binder:

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

  1. /** 
  2.  * Description: 全域性型別轉換 
  3.  * Author: liuzh 
  4.  * Update: liuzh(2014-05-26 13:08) 
  5.  */
  6. publicclass GlobalDataBinder implements WebBindingInitializer {  
  7.     /** 
  8.      * 智慧日期轉換,針對四種格式日期: 
  9.      * 1.2014-05-26 
  10.      * 2.1401951570548 
  11.      * 3.2014-05-26 00:00 
  12.      * 4.2014-05-26 00:00:00 
  13.      */
  14.     privateclass SmartDateEditor extends PropertyEditorSupport {  
  15.         /** 
  16.          * 根據2014-05-26 00:00:00長度來判斷選擇哪種轉換方式 
  17.          */
  18.         @Override
  19.         publicvoid setAsText(String text) throws IllegalArgumentException {  
  20.             if (text == null || text.length() == 0) {  
  21.                 setValue(null);  
  22.             } else {  
  23.                 try {  
  24.                     if (text.length() == 10) {  
  25.                         setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_YYYYMMDD));  
  26.                     } elseif (text.length() == 13) {  
  27.                         setValue(new Date(Long.parseLong(text)));  
  28.                     } elseif (text.length() == 16) {  
  29.                         setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_TIME_R));  
  30.                     } elseif (text.length() == 19) {  
  31.                         setValue(DateUtil.formatStringToDate(text, DateUtil.DATE_FORMAT_TIME_T));  
  32.                     } else {  
  33.                         thrownew IllegalArgumentException("轉換日期失敗: 日期長度不符合要求!");  
  34.                     }  
  35.                 } catch (Exception ex) {  
  36.                     thrownew IllegalArgumentException("轉換日期失敗: " + ex.getMessage(), ex);  
  37.                 }  
  38.             }  
  39.         }  
  40.         /** 
  41.          * 轉換為日期字串 
  42.          */
  43.         @Override
  44.         public String getAsText() {  
  45.             Date value = (Date) getValue();  
  46.             String dateStr = null;  
  47.             if (value == null) {  
  48.                 return"";  
  49.             } else {  
  50.                 try {  
  51.                     dateStr = DateUtil.formatDate(value, DateUtil.DATE_FORMAT_TIME_T);  
  52.                     if (dateStr.endsWith(" 00:00:00")) {  
  53.                         dateStr = dateStr.substring(010);  
  54.                     } elseif (dateStr.endsWith(":00")) {  
  55.                         dateStr = dateStr.substring(016);  
  56.                     }  
  57.                     return dateStr;  
  58.                 } catch (Exception ex) {  
  59.                     thrownew IllegalArgumentException("轉換日期失敗: " + ex.getMessage(), ex);  
  60.                 }  
  61.             }  
  62.         }  
  63.     }  
  64.     @Override
  65.     publicvoid initBinder(WebDataBinder binder, WebRequest request) {  
  66.         //日期格式轉換
  67.         binder.registerCustomEditor(Date.classnew SmartDateEditor());  
  68.     }  
  69. }  

這裡對日期型別進行了一些判斷來特殊處理。該類需要在Spring的xml進行配置:
  1. <beanclass="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
  2.     <propertyname="webBindingInitializer">
  3.       <beanclass="com.easternie.sys.common.GlobalDataBinder"/>
  4.     </property>
  5. </bean>
通過這種配置之後,Spring就能對日期進行智慧轉換了。