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就能对日期进行自由转换了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值