如何优雅地处理Jackson InvalidFormatException?

2022-09-04 23:03:01

我目前正在通过以下方式与Jackson一起进行Java JSON反序列化:

我想处理和反序列化我从Web服务返回的JSON响应,并在Jackson的帮助下将响应转换为POJO。这在大多数情况下都工作正常,只要我得到的响应包含正确格式的JSON属性。

但是,由于Web服务和交付的数据超出了我的控制范围,因此我不能依赖数据始终采用正确的格式。

让我举个例子:

在我的POJO中,有一个字段,JSON响应包含一个保存日期时间字符串的属性。Jackson 将尝试解析字符串并将其转换为 .如果日期格式与日期格式 () 匹配,则一切正常。如果格式不同,我得到一个.java.util.DateDateObjectMapper'sObjectMapper.setDateFormat(...)InvalidFormatException

现在的问题是,从服务发送的日期格式可能会有所不同。我可以获得格式为 的日期,但我也可以获得格式为的日期(仅标识单个月份而不是整个日期时间)。2014-11-02T00:00:00Z2014-11

我知道,我可以编写一个自定义的反序列化程序,它可以处理这种确切的情况,并正确处理具有不同日期格式的日期字符串。但是,由于这只能解决 的问题,而不能解决潜在的其他数据类型的问题,因此我正在寻找一种更通用的方法。(例如,如果我期望双精度并收到字母数字字符串,会发生什么情况?Dates

我希望能够忽略所有发生的情况,并为相应的POJO字段定义默认值(如)。InvalidFormatExceptionnull

这对我来说真的很有价值,如果尽管返回了无效的日期格式或任何其他情况,但JSON的其余部分仍然会反序列化到POJO中。InvalidFormatException

杰克逊有可能做到这一点吗?

感谢您阅读我的问题直到最后,我将不胜感激任何指向正确方向的指示。


答案 1

不确定这是否是最佳做法,我对杰克逊几乎没有经验。

您可以向 中添加 ,以指定当反序列化程序遇到奇怪的字符串或奇怪的数字时会发生什么情况。DeserializationProblemHandlerObjectMapper

在你的例子中,你可以设置处理程序,这样当遇到无法识别的格式时,它只返回一个 null,而不是抛出一个,它只是返回 null:InvalidFormatException

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.addHandler(new DeserializationProblemHandler() {
    @Override
    public Object handleWeirdStringValue(DeserializationContext ctxt, Class<?> targetType, String valueToConvert, String failureMsg) throws IOException {
        return null;
    }

    @Override
    public Object handleWeirdNumberValue(DeserializationContext ctxt, Class<?> targetType, Number valueToConvert, String failureMsg) throws IOException {
        return null;
    }
});

答案 2