在Jackson中将格式错误的日期反序列化为null

时间:2016-08-16 19:44:44

标签: java json jackson json-deserialization

我有一个Java Web应用程序,它使用Jackson 2.x来反序列化JSON请求。我目前正在与一个外部应用程序连接,该外部应用程序在其中一个类的一个属性中发送带有格式不正确的日期的JSON数据。这导致客户端调用的异常(以及它应该)。但是,出于商业原因,我们需要一个临时解决方法来接受这些请求。

直到该客户端修复它发送给我的应用程序的数据(可能有一段时间),我想将该属性中的任何错误日期视为null。我不想更改实际的类本身,因为它是一个暴露给其他客户端的公共API,我不希望这个临时解决方法包含在该类中。

是否有一种简单的方法可以将Jackson配置为将无效日期视为空?我在DeserializationFeature中看到了类似的功能,但没有特别针对此。

1 个答案:

答案 0 :(得分:1)

需要覆盖子类中原始类的setter的解决方案:

public class InvalidDateDeserializer extends JsonDeserializer<Date>
{
    @Override
    public Date deserialize(JsonParser jsonParser,
            DeserializationContext deserializationcontext) throws IOException, JsonProcessingException {
        SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy'T'HH:mm:ss");
        String date = jsonParser.getText();
        try {
            return sdf.parse(date);
        } catch (ParseException e) {
            return null;
        }
    }
}

之后,您只需要使用

在类中注释覆盖的setter
@JsonDeserialize(using = InvalidDateDeserializer.class)

所以新的DTO类看起来像这样:

public MyModel extends TheirModel {
    @Override
    @JsonDeserialize(using = InvalidDateDeserializer.class)
    public void setProblematicDate() {
        super.setProblematicDate();
    }
}

我知道这不是一个神奇的旗帜解决方案,但它应该适用于你的情况而不需要改变原来的DTO类。