考虑以下示例类:
public class TheDto {
@JsonFormat(shape = Shape.STRING, pattern = "yyMMdd", lenient = OptBoolean.FALSE)
private Date date;
@JsonFormat(shape = Shape.STRING, pattern = "yyMMdd", lenient = OptBoolean.FALSE)
private LocalDate localDate;
}
对于相同的输入,“180231”,date
字段无法解析,因为 31.February 不存在。
但是,localDate
成功,值为“180228”。
有没有办法强制执行 LocalDate
lenient=false
,以严格验证日期是否存在?
最佳答案
我建议您使用 ISO 8601尽可能采用标准,由 RFC 3339 认可还有xkcd 1179 :)
如果这样的标准不适用于您的应用程序,您可以创建自己的反序列化器,并在其中指定您自己的 DateTimeFormatter
用ResolverStyle
那可以是LENIENT
, SMART
或 STRICT
:
public class CustomLocalDateDeserializer extends JsonDeserializer<LocalDate> {
private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder()
.appendPattern("yyMMdd")
.parseDefaulting(ChronoField.ERA, 1)
.toFormatter()
.withChronology(IsoChronology.INSTANCE)
.withResolverStyle(ResolverStyle.STRICT); // Also can be LENIENT or SMART
@Override
public LocalDate deserialize(JsonParser p,
DeserializationContext ctxt) throws IOException {
String value = p.getValueAsString();
return LocalDate.parse(value, FORMATTER);
}
}
然后按如下方式使用它:
public class Foo {
@JsonDeserialize(using = CustomLocalDateDeserializer.class)
private LocalDate date;
// Getters and setters
}
String json = "{\"date\":\"180231\"}";
ObjectMapper mapper = new ObjectMapper();
Foo foo = mapper.readValue(json, Foo.class);
将 yyMMdd
视为日期格式,将 180231
作为输入。根据 ResolverStyle
会有不同的结果:
关于java - Jackson LocalDate 不存在的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52180802/