解决SpringMVC 返回Java8 时间JSON数据的格式化问题处理
发布时间 - 2026-01-10 22:59:34 点击率:次有时在Spring MVC中返回JSON格式的response的时候会使用@ResponseBody注解,不过在处理java8中时间的时候会很麻烦,一般我们使用的HTTPMessageConverter是MappingJackson2HttpMessageConverter,它默认返回的时间格式是这种:
"startDate" : {
"year" : 2010,
"month" : "JANUARY",
"dayOfMonth" : 1,
"dayOfWeek" : "FRIDAY",
"dayOfYear" : 1,
"monthValue" : 1,
"hour" : 2,
"minute" : 2,
"second" : 0,
"nano" : 0,
"chronology" : {
"id" : "ISO",
"calendarType" : "iso8601"
}
}
但是我们不会返回这种给前端使用,针对LocalDate想要返回的格式是2016-11-26,而LocalDateTime想要返回的格式是2016-11-26 21:04:34这样的数据。通过项目研究并查阅相关资料,这里介绍下个人研究中实现的两种方式。
解决方法一:
若是maven项目,在pom中引入下面的jar包:
<dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-jsr310</artifactId> <version>2.8.5</version> </dependency>
然后在你想要JSON化的POJO字段的get函数上加上一个@JsonSerializer注解,如下
import com.fasterxml.jackson.annotation.JsonFormat;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd")
public LocalDateTime getBirthday() {
return this.loginTime;
}
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
public LocalDateTime getLastLoginTime() {
return this.loginTime;
}
这种方式的优点是可以针对具体域类型设置不同显示方式,然而优点也是缺点,因为每个日期属性都要手动添加,实际中日期属性又是普遍必备,并且需要额外引入jsr310的jar包。
解决方法二:
继承ObjectMapper来实现返回json字符串。MappingJackson2HttpMessageConverter主要通过ObjectMapper来实现返回json字符串。这里我们编写一个JsonUtil类,获取ObjectMapper以针对java8中新的日期时间API,注册相应的JsonSerializer<T>。
/**
* json处理工具类
*
*
*/
@Component
public class JsonUtil {
private static final ObjectMapper mapper;
public ObjectMapper getMapper() {
return mapper;
}
static {
mapper = new ObjectMapper();
SimpleModule module = new SimpleModule();
module.addSerializer(LocalDate.class, new LocalDateSerializer());
module.addSerializer(LocalTime.class, new LocalTimeSerializer());
module.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer());
mapper.registerModule(module);
}
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字符转换为对象时失败!");
}
}
}
class LocalDateSerializer extends JsonSerializer<LocalDate> {
private static final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@Override
public void serialize(LocalDate value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeString(dateFormatter.format(value));
}
}
class LocalDateTimeSerializer extends JsonSerializer<LocalDateTime> {
private static final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
@Override
public void serialize(LocalDateTime value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeString(dateTimeFormatter.format(value));
}
}
class LocalTimeSerializer extends JsonSerializer<LocalTime> {
private static final DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH:mm:ss");
@Override
public void serialize(LocalTime value, JsonGenerator jgen, SerializerProvider provider)
throws IOException, JsonProcessingException {
jgen.writeString(timeFormatter.format(value));
}
}
然后在springmvc的配置文件中,再将<mvc:annotation-driven/>改为以下配置,配置一个新的json转换器,将它的ObjectMapper对象设置为JsonUtil中的objectMapper对象,此转换器比spring内置的json转换器优先级更高,所以与json有关的转换,spring会优先使用它。
<mvc:annotation-driven>
<mvc:message-converters>
<bean
class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
<property name="objectMapper" value="#{jsonUtil.mapper}" />
<property name="supportedMediaTypes">
<list>
<value>application/json;charset=UTF-8</value>
</list>
</property>
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
然后java8中的几种日期和时间类型就可以正常友好的显示了。优点是全局统一管理日期和时间等类型,缺点对pojo中的某个域做特殊处理。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# spring
# mvc日期格式化
# springmvc
# 时间格式化
# json
# date
# SpringBoot利用jackson格式化时间的三种方法
# springboot2.0 配置时间格式化不生效问题的解决
# 关于Springboot日期时间格式化处理方式总结
# springboot json时间格式化处理的方法
# springmvc fastjson 反序列化时间格式化方法(推荐)
# spring中时间格式化的两种方法示例讲解
# 来实现
# 解决方法
# 又是
# 都要
# 两种
# 更高
# 几种
# 相关资料
# 会很
# 设置为
# 转换为
# 再将
# 你想要
# 配置文件
# 大家多多
# 上加
# 就可以
# 中新
# 使用它
# fasterxml
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
javascript中的try catch异常捕获机制用法分析
高端网站建设与定制开发一站式解决方案 中企动力
HTML5空格在Angular项目里怎么处理_Angular中空格的渲染问题【详解】
详解Oracle修改字段类型方法总结
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
java获取注册ip实例
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel怎么自定义错误页面_Laravel修改404和500页面模板
高防服务器租用指南:配置选择与快速部署攻略
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
济南网站建设制作公司,室内设计网站一般都有哪些功能?
详解vue.js组件化开发实践
网站制作大概要多少钱一个,做一个平台网站大概多少钱?
如何实现建站之星域名转发设置?
如何在IIS中新建站点并配置端口与IP地址?
微信推文制作网站有哪些,怎么做微信推文,急?
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
智能起名网站制作软件有哪些,制作logo的软件?
linux写shell需要注意的问题(必看)
如何用腾讯建站主机快速创建免费网站?
laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法
android nfc常用标签读取总结
微信小程序 wx.uploadFile无法上传解决办法
JavaScript Ajax实现异步通信
Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】
制作旅游网站html,怎样注册旅游网站?
Google浏览器为什么这么卡 Google浏览器提速优化设置步骤【方法】
Laravel的.env文件有什么用_Laravel环境变量配置与管理详解
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
javascript读取文本节点方法小结
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Java遍历集合的三种方式
无锡营销型网站制作公司,无锡网选车牌流程?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
rsync同步时出现rsync: failed to set times on “xxxx”: Operation not permitted
JavaScript如何实现路由_前端路由原理是什么
Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
如何在Tomcat中配置并部署网站项目?
Laravel如何处理跨站请求伪造(CSRF)保护_Laravel表单安全机制与令牌校验
Laravel怎么实现模型属性的自动加密
nodejs redis 发布订阅机制封装实现方法及实例代码
想要更高端的建设网站,这些原则一定要坚持!
独立制作一个网站多少钱,建立网站需要花多少钱?
php静态变量怎么调试_php静态变量作用域调试技巧【解答】
EditPlus中的正则表达式 实战(4)
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
网站制作企业,网站的banner和导航栏是指什么?
Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境
如何在腾讯云服务器上快速搭建个人网站?

