java - 如何优雅地处理 Jackson InvalidFormatException?

标签 java json jackson

我目前正在努力通过以下方式使用 Jackson 进行 Java JSON 反序列化:

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

然而,网络服务和传送的数据不在我的控制范围内,我不能指望数据始终采用正确的格式。

举个例子:

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

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

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

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

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

Jackson 有可能做到这一点吗?

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

最佳答案

不确定这是否是最佳实践,我对 Jackson 没有什么经验。

您可以将 DeserializationProblemHandler 添加到 ObjectMapper 以指定当反序列化器遇到奇怪的字符串或奇怪的数字时会发生什么。

在您的情况下,您可以设置处理程序,以便在遇到无法识别的格式时,它不会抛出 InvalidFormatException,而是返回 null:

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;
    }
});

关于java - 如何优雅地处理 Jackson InvalidFormatException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26699227/

相关文章:

java - 无法构造 java.util.LinkedHashMap : no String-argument constructor/factory 的实例

ios - Node.js 从 iOS URLSession 主体解析 JSON

json - 使用 Dancer2::Plugin::DBIC 从数据库中提取值

python - 如何将 MongoDB 查询转换为 JSON?

spring - 如何在 Spring Boot Jackson 日期序列化中应用默认时区

java - websocket 从服务器向所有客户端发送消息

java - 检查 String 数组元素是否为 null

java - 我可以使用什么来跟踪按下了哪个按钮?

java - 如何制作像 youtube、reddit 和 twitter 等那样的起始 View /Activity ?

java - 可以使用 Jackson 从内部 json 对象获取字段吗?