Jackson无法将LocalDateTime序列化成字符串的解决办法

1.情景展示

  2025-04-02 10:54:12

  现在,Jackson已经可以对LocalDate,LocalDateTime和LocalTime进行序列化了,具体实现,见补充说明。

  在web开发过程中,如果使用的是SpringBoot框架的话, 我们通常使用在前后端数据交互的时候,我们通常会涉及到日期类型的转换。

  当我们需要将日期类型转换成字符串响应给前端时,只需要一个注解@JsonFormat就可以搞定

  这样,前端接收到的将是2021-03-17 16:51:51格式的日期格式字符串,根本无需我们手动将日期转字符串。

  使用@JsonFormat,进行手动序列化时,会不会出问题呢?

2.原因分析

  前后端交互,使用@JsonFormat可以解决日期问题,但是,在实际开发过程中,往往我们服务器对服务器,这样一来@JsonFormat就失效了。

  下面,我们来测试一下吧:

  即:它只能使用于前后端交互,具体原理我不清楚。

3.解决方案

  既然@JsonFormat不能用,那我们只能另想办法了

  通过修改ObjectMapper日期序列化格式来实现

  导包


<   dependency >
    <   groupId >com.fasterxml.jackson.datatype   
    <   artifactId >jackson-datatype-jsr310   
    <   version >2.11.3   

  代码实现

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;  
/*
 * 将包含LocalDateTime类型的属性进行序列化时转成时间字符串
 * @description: 通过Jackson实现
 * @attention: 如果自定义key名称的话,通过添加注解@JsonProperty来实现
 * @date: 2021-03-17 15:42
 * @param: bean
 * @return: java.lang.String json字符串
 * 生成的日期格式:yyyy-MM-dd HH:mm:ss
 */
public static String fromBeanWithLocalDateTime(Object bean) {
    if (    null == bean)     return "" ;

    String jsonStr =     "" ;
    try {
        ObjectMapper mapper =     new ObjectMapper();
        // 初始化JavaTimeModule
        JavaTimeModule timeModule =     new JavaTimeModule();
        // 设置LocalDateTime的序列化格式
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(    "yyyy-MM-dd HH:mm:ss" );
        timeModule.addSerializer(LocalDateTime.    class ,     new LocalDateTimeSerializer(dateTimeFormatter));
        mapper.registerModule(timeModule);
        jsonStr = mapper.writeValueAsString(bean);
    }     catch (JsonProcessingException e) {
        log.error(    "JavaBean-->json字符串转换失败:" + e.getMessage());
        return "" ;
    }

    log.debug(    "JavaBean转json字符串前:\n" + bean.toString());
    log.debug(    "JavaBean转json字符串后:\n" + jsonStr);
    return jsonStr;
}

  效果展示:

 

  2025-04-02 10:39:53

4.补充说明

当我们使用Jackson对LocatDateTime进行序列化时,可能会报以下错误:

问题的核心在于 java.time.LocalDateTime 类型在 Jackson 默认序列化器中不被支持。为了解决这个问题,需要引入 Jackson 的 jackson-datatype-jsr310 模块,并将其注册到 ObjectMapper 中。

在对应的pom.xml中添加以下依赖:

<dependency>
	<groupId>com.fasterxml.jackson.datatype</groupId>
	<artifactId>jackson-datatype-jsr310</artifactId>
	<version>2.15.2</version> <!-- 请根据实际使用的 Jackson 版本调整 -->
</dependency>

核心代码:

objectMapper.registerModule(new JavaTimeModule());

 代码展示

调用

public static void main(String[] args) {
	QycfInfoBo2 qycfInfoBo2 = new QycfInfoBo2();
	qycfInfoBo2.setCfdate(LocalDateTime.now());
	qycfInfoBo2.setSuggestdate(LocalDateTime.now());
	ObjectMapper objectMapper = new ObjectMapper();
	// 注册 JavaTimeModule 以支持 LocalDateTime
	objectMapper.registerModule(new JavaTimeModule());
	try {
		String s = objectMapper.writeValueAsString(qycfInfoBo2);
		System.out.println(s);
	} catch (JsonProcessingException e) {
		e.printStackTrace();
	}
}

效果展示 

 

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

posted @ 2021-03-17 17:17  Marydon  阅读(1939)  评论(0)    收藏  举报