杰克逊日期反序列化 - "无效"一个月的一天

时间:2018-02-22 18:24:56

标签: java json spring spring-boot jackson

我正在使用Spring Boot Jackson序列化/反序列化JSON请求/响应。在尝试反编译ISO格式的Date时,我遇到了一种我想避免的行为。

当我使用无效的月份或月份时,杰克逊通过在日期中添加额外的天数/月来处理它。

例如

{
    "date": "2018-02-40T15:00:00+01:00"
}

被反序列化为Mon Mar 12 15:00:00 CET 2018

或者

{
    "date": "2018-14-20T15:00:00+01:00"
}

Wed Feb 20 15:00:00 CET 2019

有没有办法以某种方式强制执行验证?我查看了SerializationDeserialization功能列表,但我无法找到任何可能影响此行为的内容。

我正在使用旧的Java Date API - java.util.Date

4 个答案:

答案 0 :(得分:4)

你的回答指出了正确的方向。 Jackson使用@JsonFormat之后的2.9+注释支持宽大配置。

@JsonFormat(lenient = OptBoolean.FALSE)

因此,当我使用jackson.version父POM时,我所要做的就是覆盖POM中Spring Boot属性的值。

<jackson.version>2.9.4</jackson.version>

再次感谢!

答案 1 :(得分:3)

由于您使用的是旧版API,请在与您正在使用的setLenient(false)关联的Calendar上调用DateFormat,以启用严格模式。

答案 2 :(得分:2)

SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+01:00"); 
sdf.setLenient(false);
objectMapper.setDateFormat(sdf);

类似的问题:Jackson ObjectMapper : Issues with date serialization and deserialization

答案 3 :(得分:1)

正如您提到的那样使用spring-boot
您可以为ObjectMapper

创建配置
@Configuration
public class ObjectMapperConfig {
    @Bean
    public ObjectMapper objectMapper(){
        ObjectMapper mapper = new ObjectMapper();

        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss+01:00");
        simpleDateFormat.setLenient(false);
        mapper.setDateFormat(simpleDateFormat);

        return mapper;
    }
}

然后,每当您想要使用inject <{1}} ObjectMapper

@Autowired
private ObjectMapper mapper;