java - Jackson LocalDate 不存在的日期

标签 java jackson

考虑以下示例类:

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 :)


如果这样的标准不适用于您的应用程序,您可以创建自己的反序列化器,并在其中指定您自己的 DateTimeFormatterResolverStyle那可以是LENIENT , SMARTSTRICT :

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 会有不同的结果:

  • LENIENT : date 的值为 2018-03-03
  • SMART : date 的值为 2018-02-28
  • STRICT : 将抛出异常:Invalid date 'FEBRUARY 31'

关于java - Jackson LocalDate 不存在的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52180802/

相关文章:

java - 有没有一种准确的方法来确定两个 Java 进程之间的 nanoTime 差异?

java - 如何减少我的 Java 2d 平台游戏中的延迟?

java - jackson 序列化没有正确处理单引号

java - 将字符串转换为json

java - 尝试在 Java 中创建 json 对象但获取嵌套数组?如何以更好的方式做到这一点?

java - Telnet Java 套接字测试

java - 如何在 play 框架 2.1.* 中使用 ajax

java - 为什么我们不需要为静态方法创建对象?

spring - 用 Spring 调试 Jackson

java - 如何将 Jackson mixin 添加到读取器而不是对象映射器?