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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
包含以下java源文件: com.google.gson.DefaultDateTypeAdapter.class com.google.gson.ExclusionStrategy.class com.google.gson.FieldAttributes.class com.google.gson.FieldNamingPolicy.class com.google.gson.FieldNamingStrategy.class com.google.gson.Gson.class com.google.gson.GsonBuilder.class com.google.gson.InstanceCreator.class com.google.gson.JsonArray.class com.google.gson.JsonDeserializationContext.class com.google.gson.JsonDeserializer.class com.google.gson.JsonElement.class com.google.gson.JsonIOException.class com.google.gson.JsonNull.class com.google.gson.JsonObject.class com.google.gson.JsonParseException.class com.google.gson.JsonParser.class com.google.gson.JsonPrimitive.class com.google.gson.JsonSerializationContext.class com.google.gson.JsonSerializer.class com.google.gson.JsonStreamParser.class com.google.gson.JsonSyntaxException.class com.google.gson.LongSerializationPolicy.class com.google.gson.TreeTypeAdapter.class com.google.gson.TypeAdapter.class com.google.gson.TypeAdapterFactory.class com.google.gson.annotations.Expose.class com.google.gson.annotations.SerializedName.class com.google.gson.annotations.Since.class com.google.gson.annotations.Until.class com.google.gson.internal.ConstructorConstructor.class com.google.gson.internal.Excluder.class com.google.gson.internal.JsonReaderInternalAccess.class com.google.gson.internal.LazilyParsedNumber.class com.google.gson.internal.LinkedTreeMap.class com.google.gson.internal.ObjectConstructor.class com.google.gson.internal.Primitives.class com.google.gson.internal.Streams.class com.google.gson.internal.UnsafeAllocator.class com.google.gson.internal.bind.ArrayTypeAdapter.class com.google.gson.internal.bind.CollectionTypeAdapterFactory.class com.google.gson.internal.bind.DateTypeAdapter.class com.google.gson.internal.bind.JsonTreeReader.class com.google.gson.internal.bind.JsonTreeWriter.class com.google.gson.internal.bind.MapTypeAdapterFactory.class com.google.gson.internal.bind.ObjectTypeAdapter.class com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.class com.google.gson.internal.bind.SqlDateTypeAdapter.class com.google.gson.internal.bind.TimeTypeAdapter.class com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.class com.google.gson.internal.bind.TypeAdapters.class com.google.gson.reflect.TypeToken.class com.google.gson.stream.JsonReader.class com.google.gson.stream.JsonScope.class com.google.gson.stream.JsonToken.class com.google.gson.stream.JsonWriter.class com.google.gson.stream.MalformedJsonException.class

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值