繁体   English   中英

有什么办法可以在不中断反序列化过程的情况下忽略JsonProcessingException

[英]Is there any way to ignore JsonProcessingException without breaking deserialization process

我正在寻找一种针对Jackson的反序列化JSON到类实例的解决方案,而不会破坏整个过程,目前我正在执行以下操作:

如果Actor.class像这样:

@JsonInclude(JsonInclude.Include.NON_EMPTY)
@JsonPropertyOrder(alphabetic = true)
public abstract class BaseDTO {

}

public class Character extend BaseDTO {
    private LocalDateTime updatedDate;
    private String name;

    // Setters and getters 
}

并反序列化json {"updatedDate":"N/A", "name": "Jon Snow"}如下所示:

String json = "{\"updatedDate\":\"N/A\", \"name\": \"Jon Snow\"}";
ObjectMapper mapper = new ObjectMapper();
final Character character = mapper.reader().forType(Character.class).readValue(json);

或直接作为Play框架:

final Character character = Json.fromJson(json, Character.class);

我肯定会得到像这样的异常:

Caused by: com.fasterxml.jackson.databind.exc.InvalidFormatException: Cannot deserialize value of type `java.time.LocalDateTime` from String "N/A": Text 'N/A' could not be parsed at index 0

InvalidFormatException实际上是JsonProcessingException ,还有MismatchedInputException和其他异常,因此我需要以某种方式优雅地继续处理并获取对象character并至少具有name值,而不是完全停止它。

我更喜欢:

  • 使用批注来配置解析器或要应用于BaseDTO任何解决方案。
  • 将问题记录在日志文件中,这样我就知道发生了什么问题。

我现在真的需要付出巨大的努力才能找到解决之道,所以我想知道是否有任何现成的解决方案可以在不重新发明轮子的情况下做到这一点。

我假设您不希望将N/A类的字符串视为null。 使用自定义解串器可以像这样实现。

class LocalDateTimeDeserializer extends JsonDeserializer<LocalDateTime> {
    @Override
    public LocalDateTime deserialize(JsonParser p, DeserializationContext context) throws IOException {
        if ("N/A".equals(p.getText())) return null;
        return LocalDateTime.from(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(p.getText()));
    }
}

希望这可以帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM