gpt4 book ai didi

java - 如何禁用 Jackson 从 epoch millis 反序列化 Instant?

转载 作者:搜寻专家 更新时间:2023-10-31 20:16:39 27 4
gpt4 key购买 nike

我正在使用 Spring Boot 开发 API,并使用 Jackson 进行负载(反)序列化。我想将 ISO-8601 格式的日期时间反序列化为 java.time.Instant,但不想支持从以毫秒或纳秒为单位的纪元时间反序列化。我只想支持以一种格式提供给我的 API 的数据,以减少客户端出错的可能性。

目前,Jackson 从 ISO-8601 格式的字符串和仅包含数字的字符串反序列化为 Instant,例如“20190520”

我可以在我的 Instant 字段上使用 Jackson 注释,或者我可以设置属性来应用这种行为吗?还是自定义反序列化器是我唯一的选择?

最佳答案

Are there Jackson annotations I can use on my Instant field, or properties I can set to apply this kind of behaviour? Or is a custom deserializer my only option?

我个人并不知道注释会为您开箱即用;但以下是完成这项工作的简单反序列化器:

import java.io.IOException;
import java.time.Instant;

import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StdDeserializer;

public class JacksonInstantDeserializer extends StdDeserializer<Instant> {
public JacksonInstantDeserializer() { this(null); }
public JacksonInstantDeserializer(Class<?> clazz) { super(clazz); }

@Override
public Instant deserialize(JsonParser parser, DeserializationContext ctx) throws IOException {
return Instant.parse(parser.getText());
}
}

它基本上使用Instant.parse ;它接受ONLY 一个ISO-8601 formatted string (如果字符串没有相应地格式化,它会抛出一个 DateTimeParseException)并根据它的表示创建一个 Instant。然后您可以使用 tell jackson 使用此转换器以下列方式反序列化 DTO 的 Instant 属性:

    public class MyDTO {
@JsonDeserialize(using = JacksonInstantDeserializer.class)
public Instant instant;
}

Complete code on GitHub

希望这对您有所帮助。

关于java - 如何禁用 Jackson 从 epoch millis 反序列化 Instant?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56158387/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com