使用杰克逊的 LocalDateTime 解析

Posted

技术标签:

【中文标题】使用杰克逊的 LocalDateTime 解析【英文标题】:LocalDateTime parsing with jackson 【发布时间】:2020-10-16 00:01:51 【问题描述】:

我在将 JSON 映射到具有 LocalDateTime 的 DTO 时遇到问题。

我关注了这个帖子: JSON parse error: Can not construct instance of java.time.LocalDate: no String-argument constructor/factory method to deserialize from String value

添加到 build.gradle

implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.0'

这是我的 DTO 中的变量:

@Data
public class MyDto 
    private Long teamId;

    private Map<String, List<Long>> details;

    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime dateOccurred;


并添加了这个

public class MyApplication 
    @Autowired
    private ObjectMapper objectMapper;

    public static void main(String[] args) 
        SpringApplication.run(MyApplication.class, args);
    

    @PostConstruct
    public void setUp() 
        objectMapper.registerModule(new JavaTimeModule());
    

我错过了什么吗?我收到此错误

org.springframework.messaging.converter.MessageConversionException: Could not read JSON: Cannot construct instance of `java.time.LocalDateTime` (no Creators, like default construct, exist): no String-argument constructor/factory method to deserialize from String value ('2020-06-16 11:12:46')

谢谢!

【问题讨论】:

在这里查看答案:***.com/a/29959842/3415090 这更多地与弹簧启动有关,但我认为添加提到的额外杰克逊依赖项可能会解决您的问题。 分享LocalDateTime所属的整个bean。 @GoviS 更新了帖子 @mohammedkhan 我试过了,但还是一样。 :( @mohammedkhan 嗨,谢谢!现在可以了!我错误地添加了LocalDateDeerializer 而不是LocalDateTimeDeserializer。非常感谢! 【参考方案1】:

感谢@mohammedkhan 的指导!

在这个答案中: JSON Java 8 LocalDateTime format in Spring Boot

spring-boot中已经有设置了,不用@AutowireObjectMapper

为 Json Deserializer 添加这个注解

@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime dateOccurred;

谢谢!

【讨论】:

serialization 属性对您正在执行的 反序列化 没有帮助。同样LocalDateTimeDeserializer 已经负责反序列化LocalDateTime,假设您正确注册了JavaTimeModule(您可以在其构造函数实现中看到)。这里不需要它(除非你的代码中有一些东西你没有向我们展示)。 @SotiriosDelimanolis 嗨,先生。我不确定是否还有别的东西。这些是我所做的唯一更改并且它正在运行。这是我正在检查的答案的链接。 blog.chris-ritchie.com/2014/09/… 如果您有任何其他见解,请告诉我 :) 那篇 2014 年的博文展示了如果您不注册 JavaTimeModule 会做什么。根据您问题中的代码,您是,所以不需要。 @SotiriosDelimanolis ***.com/questions/51527794/… 我已经尝试了另一个。这两种方法,但它仍然不起作用:(

以上是关于使用杰克逊的 LocalDateTime 解析的主要内容,如果未能解决你的问题,请参考以下文章

如何用杰克逊序列化 LocalDateTime?

使用杰克逊解析领域模型

杰克逊:使用时区 id 解析 ZonedDateTime

杰克逊:反序列化(解析)空Unicode

杰克逊:我怎么能忽略getter但解析setter? [复制]

由于输入结束杰克逊解析器,没有要映射的内容