我正在使用Spring Boot开发API,并且正在使用Jackson进行有效负载(反序列化)。我想将ISO-8601格式的日期时间反序列化为java.time.Instant
,但不希望支持从以毫秒或纳秒为单位的历元时间反序列化。我只想支持以一种格式提供给我的API的数据,以减少出现客户端错误的机会。
当前,Jackson从ISO-8601格式的字符串和仅包含数字(例如,数字)的字符串中反序列化为Instant。 "20190520"
。
我可以在我的Instant
字段中使用Jackson注释,还是可以设置以应用这种行为的属性?还是自定义解串器是我唯一的选择?
答案 0 :(得分:1)
我可以在“即时”字段中使用Jackson注释,还是可以设置以应用这种行为的属性?还是自定义解串器是我唯一的选择?
我个人不知道会为您开箱即用的注释;但是以下是完成此工作的简单反序列化器:
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
;它仅接受仅 ISO-8601 formatted string(如果未对字符串进行相应格式设置,则会抛出DateTimeParseException
),并根据其表示形式创建Instant
。然后,您可以使用Tell Jackson来使用此转换器以以下方式反序列化DTO的Instant
属性:
public class MyDTO {
@JsonDeserialize(using = JacksonInstantDeserializer.class)
public Instant instant;
}
希望这会有所帮助。