SpringMVC 返回Java 8 时间JSON数据的格式化问题处理

有时在Spring MVC中返回JSON格式的response的时候会使用@ResponseBody注解,不过在处理时间的时候会很麻烦,一般我们使用的HTTPMessageConverter是MappingJackson2HttpMessageConverter,它默认返回的时间格式是这种:

 1 "startDate" : {
 2     "year" : 2010,
 3     "month" : "JANUARY",
 4     "dayOfMonth" : 1,
 5     "dayOfWeek" : "FRIDAY",
 6     "dayOfYear" : 1,
 7     "monthValue" : 1,
 8     "hour" : 2,
 9     "minute" : 2,
10     "second" : 0,
11     "nano" : 0,
12     "chronology" : {
13       "id" : "ISO",
14       "calendarType" : "iso8601"
15     }
16   }

但是一般情况下我们不会返回这种给前端使用,针对LocalDate想要返回的格式是2016-11-26,而LocalDateTime想要返回的格式是2016-11-26 21:04:34这样的数据。通过项目研究并查阅相关资料,这里介绍下个人研究中实现的两种方式。

解决方法一:

若是maven项目,在pom中引入下面的jar包:

1 <dependency>
2      <groupId>com.fasterxml.jackson.datatype</groupId>
3      <artifactId>jackson-datatype-jsr310</artifactId>
4      <version>2.8.5</version>
5 </dependency>

然后在你想要JSON化的POJO字段的get函数上加上一个@JsonSerializer注解,如下

 1 import com.fasterxml.jackson.annotation.JsonFormat;
 2
 3 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
 4 public LocalDateTime getBirthday() {
 5         return this.loginTime;
 6     }
 7
 8 @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
 9 public LocalDateTime getLastLoginTime() {
10         return this.loginTime;
11     }

这种方式的优点是可以针对具体域类型设置不同显示方式,然而优点也是缺点,因为要在各个POJO上写上诸如上面的注解,并且需要额外引入jsr310的jar包。

解决方法二:

自定义LocalDate和LocalDateTime的序列化类,并注册到object mapper中

 1 /**
 2  * json处理工具类
 3  *
 4  *
 5  */
 6 @Component
 7 public class JsonUtil {
 8
 9     private static final ObjectMapper mapper;
10
11     public ObjectMapper getMapper() {
12         return mapper;
13     }
14
15     static {
16
17         mapper = new ObjectMapper();
18
19         SimpleModule module = new SimpleModule();
20         module.addSerializer(LocalDate.class, new LocalDateSerializer());
21         module.addSerializer(LocalTime.class, new LocalTimeSerializer());
22         module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
23         mapper.registerModule(module);
24     }
25
26     public static String toJson(Object obj) {
27         try {
28             return mapper.writeValueAsString(obj);
29         } catch (Exception e) {
30             throw new RuntimeException("转换json字符失败!");
31         }
32     }
33
34     public <T> T toObject(String json, Class<T> clazz) {
35         try {
36             return mapper.readValue(json, clazz);
37         } catch (IOException e) {
38             throw new RuntimeException("将json字符转换为对象时失败!");
39         }
40     }
41 }
42
43 class LocalDateSerializer extends JsonSerializer<LocalDate> {
44
45     private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
46
47     @Override
48     public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider)
49             throws IOException, JsonProcessingException {
50         jgen.writeString(dateFormatter.format(value));
51     }
52 }
53
54 class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
55
56     private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
57
58     @Override
59     public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider provider)
60             throws IOException, JsonProcessingException {
61         jgen.writeString(dateTimeFormatter.format(value));
62     }
63
64 }
65
66 class LocalTimeSerializer extends JsonSerializer<LocalTime> {
67
68     private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
69
70     @Override
71     public void serialize(LocalTime value, JsonGenerator jgen, SerializerProvider provider)
72             throws IOException, JsonProcessingException {
73         jgen.writeString(timeFormatter.format(value));
74
75     }
76
77 }

然后在springmvc的配置文件中,再将<mvc:annotation-driven/>改为以下配置,配置一个新的json转换器,将它的ObjectMapper对象设置为JsonUtil中的objectMapper对象,此转换器比spring内置的json转换器优先级更高,所以与json有关的转换,spring会优先使用它。

 1 <mvc:annotation-driven>
 2         <mvc:message-converters>
 3             <bean
 4                 class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
 5                 <property name="objectMapper" value="#{jsonUtil.mapper}" />
 6                 <property name="supportedMediaTypes">
 7                     <list>
 8                         <value>application/json;charset=UTF-8</value>
 9                     </list>
10                 </property>
11             </bean>
12         </mvc:message-converters>
13     </mvc:annotation-driven>

然后java8中的几种日期和时间类型就可以正常友好的显示了。优点是全局统一管理日期和时间等类型,缺点对pojo中的某个域做特殊处理。

时间: 2024-10-10 17:18:32

SpringMVC 返回Java 8 时间JSON数据的格式化问题处理的相关文章

修改springmvc返回ajax方式的json数据

现在由这么一个需求,就是修改几个功能模块的springmvc的ajax请求返回值(对返回值加密), 因为controller很多,而且以前抱着开闭原则,这里就选择使用拦截器的方式(是Filter不是spring的handlerFilter).废话不多少,上代码.(原始controller里返回的都是json数据). 修改web.xml 添加filter <filter> <filter-name>jsonFilter</filter-name> <filter-c

【转载】C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte

C#.NET WebApi返回各种类型(图片/json数据/字符串),.net图片转二进制流或byte 转载:http://www.itdos.com/Mvc/20150302/0741255.html using System.IO; /// <summary> /// WebApi返回图片 /// </summary> public HttpResponseMessage GetQrCode() { var imgPath = @"D:\ITdosCom\Images

Java解析(读取)Json数据

以前看过书上说,XML是web service间传输信息的标准格式吧,就看了看XML.最近在做个网站,又说是有了JSON,第一回听说就看了看,总结总结一下. 1.JSON介绍 JSON比XML简单,主要体现在传输相同信息的情况下,文件的大小不同. JSON只用于传输信息,XML还可以用于配置文件的使用. JSON中的符号主要有: " , [ {: 2.JSON中的数组和对象 2.1数组(JSONArray) 数组用一对[],表示存放的是一般的数组数据. 如:["11",&qu

利用Gson将JSON数据进行格式化(pretty print)

我们可以利用Gson包将String类型的JSON数据进行格式化. Gson gson = new GsonBuilder().setPrettyPrinting().create(); JsonParser jp = new JsonParser(); JsonElement je = jp.parse(uglyJSONString); String prettyJsonString = gson.toJson(je); 使用 new GsonBuilder.setPrettyPrinting

spingmvc 返回json数据日期格式化方法

第一种: json 用的是这个依赖 <!-- JSON lib 开发包 以及它的依赖包 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.6.0</version> </dependency> 在springmvc返回j

SpringMVC从Control中响应json数据

在页面上异步获取Controller中响应的json数据. <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR

java 后台封装json数据学习总结(一)

一.数据封装 1. List集合转换成json代码 List list = new ArrayList(); list.add( "first" ); list.add( "second" ); JSONArray jsonArray2 = JSONArray.fromObject( list ); 2. Map集合转换成json代码 Map map = new HashMap(); map.put("name", "json"

Java解析复杂JSON数据的一种方法

1.需解析JSON数据: { "code": 0, "message": "success", "sid": "[email protected]", "data": { "result": { "age": { "age_type": "0", "child": "0.1452

微信小程序如何把后台返回的多条json数据的时间戳转换为时间放到页面上 (微信小程序 时间戳转换为时间)

小程序端 在utils文件夹下的util.js写入 //时间戳转换时间   function toDate(number){   var n=number * 1000;   var date = new Date(n);   var Y = date.getFullYear() + '/';   var M = (date.getMonth()+1 < 10 ? '0'+(date.getMonth()+1) : date.getMonth()+1) + '/';   var D = date