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

时间:2018-07-04 12:15:34

标签: java playframework jackson jackson-databind

我正在寻找一种针对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并拥有{至少{1}}值而不是完全停止。

我更愿意:

  • 使用注释配置解析器或要应用于name的任何解决方案。
  • 将问题记录在日志文件中,所以我知道发生了什么问题。

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

1 个答案:

答案 0 :(得分:0)

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

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

希望这会有所帮助!