【异常】使用Jackson序列化LocalDateTime类型报错的解决方法

使用Jackson序列化LocalDateTime类型报错的解决方法

环境版本

      <!-- 当前环境jdk版本是 java8 -->
      <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.11.3</version>
      </dependency>

异常信息

Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default constructor, exist): no String-argument constructor/factory method to deserialize from String value ('2023-11-08 11:27:02')
 at [Source: (String)"{"createDate":"2023-11-08 11:27:02","updateDate":"2023-11-08 11:27:02"}"; line: 1, column: 15] (through reference chain: top.shiqudehuiyi.designpattern.vo.BaseVO["createDate"])
	at com.fasterxml.jackson.databind.exc.InvalidDefinitionException.from(InvalidDefinitionException.java:67)
	at com.fasterxml.jackson.databind.DeserializationContext.reportBadDefinition(DeserializationContext.java:1615)
	at com.fasterxml.jackson.databind.DatabindContext.reportBadDefinition(DatabindContext.java:400)
	at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1077)
	at com.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:371)
	at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:323)
	at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1408)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:176)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:166)
	at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:129)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:293)
	at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:156)
	at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:4526)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3468)
	at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:3436)

解决方案

全局应用

用于封装一层jackson工具类的实现


import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Data;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Data
public class BaseVO {

  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
//  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
//  @JsonSerialize(using = LocalDateTimeSerializer.class)
  private LocalDateTime createDate;

  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
//  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
//  @JsonSerialize(using = LocalDateTimeSerializer.class)
  private LocalDateTime updateDate;


  public static void main(String[] args) throws JsonProcessingException {
    String json = "{\"createDate\":\"2023-11-08 11:27:02\",\"updateDate\":\"2023-11-08 11:27:02\"}";
    ObjectMapper objectMapper = new ObjectMapper();
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    javaTimeModule.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
    objectMapper.registerModule(javaTimeModule);
    BaseVO baseVO = objectMapper.readValue(json, BaseVO.class);
    System.out.println(objectMapper.writeValueAsString(baseVO));
  }
}

局部应用

在局部使用的方式可以通过注解来实现

测试代码
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import lombok.Data;

import java.time.LocalDateTime;

@Data
public class BaseVO {

  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  @JsonSerialize(using = LocalDateTimeSerializer.class)
  private LocalDateTime createDate;
  
  // 格式化时间注解
  @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  // 反序列化注解
  @JsonDeserialize(using = LocalDateTimeDeserializer.class)
  // 序列化注解
  @JsonSerialize(using = LocalDateTimeSerializer.class)
  private LocalDateTime updateDate;


  public static void main(String[] args) throws JsonProcessingException {
    String json = "{\"createDate\":\"2023-11-08 11:27:02\",\"updateDate\":\"2023-11-08 11:27:02\"}";
    ObjectMapper objectMapper = new ObjectMapper();
    BaseVO baseVO = objectMapper.readValue(json, BaseVO.class);
    System.out.println(objectMapper.writeValueAsString(baseVO));
  }
}

小结

通过以上方案,可以看出来,jackson对于LocalDateTime等时间戳类型需要手动定义后才允许进行序列化和反序列化,目前我提供的方案只是最基础简陋的使用方案,具体方案待后续开发需要使用到在更新!

借鉴引用

Jackson 之 LocalDateTime 序列化与反序列化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用 Jackson 库来序列化 LocalDateTime 对象。首先,确保你已经在项目中引入了 Jackson 的依赖。然后,按照以下步骤进行序列化: 1. 创建一个 ObjectMapper 对象,它是 Jackson 库的核心类之一,用于执行序列化和反序列化操作。 2. 在 ObjectMapper 对象上设置适当的配置,以便正确地处理 LocalDateTime 类型。 3. 将 LocalDateTime 对象传递给 ObjectMapper 的 writeValueAsString() 方法,该方法将返回一个包含序列化结果的 JSON 字符串。 以下是一个示例代码: ```java import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import java.time.LocalDateTime; public class LocalDateTimeSerializer { public static void main(String[] args) throws Exception { // 创建 ObjectMapper 对象 ObjectMapper objectMapper = new ObjectMapper(); // 注册 JavaTimeModule 模块,以支持 LocalDateTime 类型 objectMapper.registerModule(new JavaTimeModule()); // 创建 LocalDateTime 对象 LocalDateTime dateTime = LocalDateTime.now(); // 序列化JSON 字符串 String jsonString = objectMapper.writeValueAsString(dateTime); // 输出序列化结果 System.out.println(jsonString); } } ``` 运行以上代码,你将会得到一个包含序列化后的 LocalDateTime 对象的 JSON 字符串。请注意,Jackson 库对于 LocalDate、LocalTime 和 LocalDateTime 类型序列化和反序列化需要添加 `com.fasterxml.jackson.datatype:jackson-datatype-jsr310` 的依赖。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值