最近公司项目需要发布一些数据服务,从设计到实现两天就弄完了,心中窃喜之。 结果临近部署时突然发现。。。。。 服务输出的JSON 数据中 date 类型数据输出格式要么是时间戳,要么是 {"date":26,"day":1,"hours":21,"minutes":38,"month":5,"seconds":22,"time":1498484302259,"timezoneOffset":-480,"year":117} 这种格式。 妹的,急死我也! 感谢百度,感谢各位前辈解我之急,在家苦干三小时总结出几种date类数据格式转换的方法;
前提:需要架包 jackson-annotations-2.7.4.jar ,jackson-core-2.7.4.jar, jackson-databind-2.7.4.jar
第一种:直接上配置 在springmvc 的配置文件中 注解配置改为:
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
<!-- Json 转换配置 -->
<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>
<property name="supportedMediaTypes">
<list>
<value>text/plain;charset=utf-8</value>
<value>text/html;charset=utf-8</value>
<value>text/json;charset=utf-8</value>
<value>application/json;charset=utf-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
这种方法简单。。太简单了。无需其他配置,全局有效。
第二种 针对需独立转换的数据(部分转换)
以上配置可以不用了,需要自定义json序列化日期数据的实现方式
//内容不多,主要为了指定转换方式
import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; public class CustomDateSerializer extends JsonSerializer<Date> { @Override public void serialize(Date arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException, JsonProcessingException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); //转换格式 arg1.writeString(sdf.format(arg0)); //写入转换后的值 } }
好了,写好了。现在我们只需在需要转换的date字段上添加 注解 @JsonSerialize 即可:
@JsonSerialize(using = CustomDateSerializer.class) //使用注解 @JsonFormat(pattern="yyyy/MM/dd HH:mm:ss",timezone = "GMT+8") 也可以 private Date time2;
再没有其他操作了。
第三种:也是针对全局转换的方式,需要些一个工具类(仔细观察和第二种很多相似的地方)
/* +-------------------------------------------------------------------------- | Mblog [#RELEASE_VERSION#] | ======================================== | Copyright (c) 2014, 2015 mtons. All Rights Reserved | http://www.mtons.com | +--------------------------------------------------------------------------- */ package com.dm.restWeb.config; import java.io.IOException; import java.lang.reflect.AnnotatedElement; import java.text.SimpleDateFormat; import java.util.Date; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.introspect.Annotated; import com.fasterxml.jackson.databind.introspect.AnnotatedMethod; import com.fasterxml.jackson.databind.introspect.JacksonAnnotationIntrospector; /** * @author langhsu * */ @Component public class JsonUtils { private static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd"; private static final ObjectMapper mapper; public ObjectMapper getMapper() { return mapper; } static { SimpleDateFormat dateFormat = new SimpleDateFormat(DEFAULT_DATE_FORMAT); mapper = new ObjectMapper(); mapper.setDateFormat(dateFormat); mapper.setAnnotationIntrospector(new JacksonAnnotationIntrospector() { private static final long serialVersionUID = -5854941510519564900L; @Override public Object findSerializer(Annotated a) { if (a instanceof AnnotatedMethod) { AnnotatedElement m = a.getAnnotated(); DateTimeFormat an = m.getAnnotation(DateTimeFormat.class); if (an != null) { if (!DEFAULT_DATE_FORMAT.equals(an.pattern())) { return new JsonDateSerializer(an.pattern()); } } } return super.findSerializer(a); } }); } public static String toJson(Object obj) { try { return mapper.writeValueAsString(obj); } catch (Exception e) { throw new RuntimeException("转换json字符失败!"); } } public <T> T toObject(String json, Class<T> clazz) { try { return mapper.readValue(json, clazz); } catch (IOException e) { throw new RuntimeException("将json字符转换为对象时失败!"); } } public static class JsonDateSerializer extends JsonSerializer<Date> { private SimpleDateFormat dateFormat; public JsonDateSerializer(String format) { dateFormat = new SimpleDateFormat(format); } @Override public void serialize(Date date, JsonGenerator gen, SerializerProvider provider) throws IOException, JsonProcessingException { String value = dateFormat.format(date); gen.writeString(value); } } }
其实就是用静态方法来实现获取 ObjectMapper 对象;
还需要在springmvc 配置文件中写入配置:
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- Json --> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper" value="#{jsonUtils.mapper}"/> <!-- 和第一种方法配置模式一样 --> <property name="supportedMediaTypes"> <list> <value>text/plain;charset=utf-8</value> <value>text/html;charset=utf-8</value> <value>text/json;charset=utf-8</value> <value>application/json;charset=utf-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
你会发现第三种方法和第一种方法是差不多的 , 但是第三种方法支持 使用 @JsonFormat 注解来实现指定日期格式特定输出。
所以从代码实现看来 第三种方式功能最全面,第一种方式配置最简便 ,第二种配置方式不推荐。