【问题标题】:How to deserialize a java.time.Instant from string?如何从字符串反序列化 java.time.Instant?
【发布时间】:2020-10-22 19:30:00
【问题描述】:

我正在向我的 rest api 发送一个 jsonobject,其中一个字段是日期类型:

{
 creationDate: '2017-12-27T11:23:58+01:00'
}

我想解码所以我就这样做:

private final ObjectMapper mapper; //I take the default one

//...
objectMapper.readValue(message.getBody().toJSONString(), MyClass.clazz);

地点:

public class MyClazz{
    ...
    private Instant creationDate;
}

但最后我得到:

com.fasterxml.jackson.databind.exc.InvalidFormatException:无法从字符串“2017-12-27T11:23:58+01:00”反序列化 java.time.Instant 类型的值:无法反序列化 java.time.Instant: (java.time.format.DateTimeParseException) 文本'2017-12-27T11:23:58+01:00'

我检查了我的配置,但我正在导入我需要的每个模块:

@Configuration
public class JacksonConf {

@Bean
public JavaTimeModule javaTimeModule() {
    return new JavaTimeModule();
}

@Bean
public Jdk8Module jdk8TimeModule() {
    return new Jdk8Module();
}

怎么了?

【问题讨论】:

  • 为什么要自己编组一个 JSONObjct?您不应该需要这些模块(它们会被自动检测到),您可以让 Spring 在不使用 JSONObject 的情况下进行转换。只需将@RequestBody MyClazz value 添加到您的控制器即可。您可能需要在字段上添加 JsonFormat 注释来指定使用的格式。
  • 说来话长....通常我使用pojos,但在这种情况下,我必须支持我不知道字段的通用对象
  • 显然你不这样做,因为你正在反序列化到一个对象,所以你知道单向或其他。
  • 不,因为我从对象字段中获取类型,对其进行转换,然后将其发送到服务...问题是我要转换的泛型类型没有定义字段跨度>

标签: spring-boot jackson deserialization


【解决方案1】:

问题在于日期格式,JavaTimeModule 中似乎没有功能,请为Instant 使用自定义格式(与LocalDateTime 不同)。一种解决方法是覆盖即时反序列化器:

@Bean
public JavaTimeModule javaTimeModule() {
    JavaTimeModule javaTimeModule = new JavaTimeModule();
    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX");
    javaTimeModule.addDeserializer(Instant.class, new StdDeserializer<Instant>(Instant.class) {
        @Override
        public Instant deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
            return OffsetDateTime.parse(jsonParser.readValueAs(String.class), formatter).toInstant();
        }
    });
    return javaTimeModule;
}

【讨论】:

  • 我知道了它的要点,但它仍然不起作用......可能是字符串格式问题
猜你喜欢
  • 2022-01-12
  • 2023-01-01
  • 2010-11-22
  • 2018-01-19
  • 2013-07-16
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多