首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用Jackson从String反序列化LocalDateTime

用Jackson从String反序列化LocalDateTime
EN

Stack Overflow用户
提问于 2018-09-03 09:10:34
回答 2查看 29.4K关注 0票数 8

我试图用Jackson将一个String反序列化为LocalDateTime,但它不起作用。

我有一个带有LocalDateTime字段的数据类:

代码语言:javascript
运行
复制
@Data
public class Registration {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss")
    private LocalDateTime timestamp;
}

我添加了特殊的Jackson数据类型模块:

代码语言:javascript
运行
复制
compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")

序列化可以很好地处理:

代码语言:javascript
运行
复制
new ObjectMapper().registerModule(new JavaTimeModule()).writeValueAsString(registration);

结果字符串:

代码语言:javascript
运行
复制
{"timestamp":"2018-09-03 10:09:35"}

但是反序列化不适用于:

代码语言:javascript
运行
复制
new ObjectMapper().registerModule(new JavaTimeModule()).readValue(json.traverse(), Registration.class)

作为错误,我得到:

代码语言:javascript
运行
复制
Cannot deserialize value of type `java.time.LocalDateTime` from String "2018-09-03 10:09:35": 
    Failed to deserialize java.time.LocalDateTime: 
        (java.time.format.DateTimeParseException) Text '2018-09-03 10:09:35' could not be parsed: 
            Unable to obtain LocalDateTime from TemporalAccessor: 
                {MinuteOfHour=9, NanoOfSecond=0, SecondOfMinute=35, MicroOfSecond=0, MilliOfSecond=0, HourOfAmPm=10},
                ISO resolved to 2018-09-03 of type java.time.format.Parsed

我遗漏了什么?我感到困惑的是,序列化可以工作,但反序列化却不能。

MWE: (小规模Java项目)

Main.java:

代码语言:javascript
运行
复制
import java.io.IOException;
import java.time.LocalDateTime;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.core.TreeNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

public class Main {

    public static void main(String[] args) throws IOException {
        Registration registration = new Registration();
        registration.setTimestamp(LocalDateTime.now());

         ObjectMapper objectMapper = new ObjectMapper().registerModule(new JavaTimeModule());

         String s = objectMapper.writeValueAsString(registration);
         TreeNode treeNode = objectMapper.readTree(s);

         //Fails here:
         Registration registration1 = objectMapper.readValue(treeNode.traverse(), Registration.class);

        System.out.println(registration1);
    }
}

class Registration {
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss")
    private LocalDateTime timestamp;

    public Registration() {
    }

    public LocalDateTime getTimestamp() {
        return this.timestamp;
    }

    public void setTimestamp(LocalDateTime localDateTime) {
        this.timestamp = localDateTime;
    }
}

build.gradle:

代码语言:javascript
运行
复制
plugins {
    id 'java'
}

group 'dateMWE'
version '1.0-SNAPSHOT'

sourceCompatibility = 10

repositories {
    mavenCentral()
}

dependencies {
    compile("com.fasterxml.jackson.core:jackson-annotations:2.9.6")
    compile("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.6")
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-09-03 09:39:22

问题与JSON反序列化无关,而是与时间格式字符串有关:

代码语言:javascript
运行
复制
pattern = "yyyy-MM-dd hh:mm:ss"

请注意,时间设置为hh:这是一个12小时的格式化程序,需要"AM“或"PM”值。

如果将模式更改为

代码语言:javascript
运行
复制
pattern = "yyyy-MM-dd HH:mm:ss"

这个问题应该解决。

票数 17
EN

Stack Overflow用户

发布于 2018-09-03 09:48:02

您的ObjectMapper不是按spring管理的,因为您正在使用新的对象创建对象。在配置文件中将ObjectMapper配置为Bean。您需要向您的DateTimeFormat注册LocalDateTimeDeserializer。然后在JavaTimeModule中设置反序列化器。

代码语言:javascript
运行
复制
@Bean
public ObjectMapper objectMapper() {
    JavaTimeModule module = new JavaTimeModule();
    LocalDateTimeDeserializer localDateTimeDeserializer = new
            LocalDateTimeDeserializer(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    module.addDeserializer(LocalDateTime.class, localDateTimeDeserializer);
    ObjectMapper objectMapperObj = Jackson2ObjectMapperBuilder.json()
            .modules(module)
            .featuresToDisable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
            .build();
    return objectMapperObj;
}

在Spring配置中设置上述配置。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52146579

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档