Есть ли способ игнорировать JsonProcessingException, не нарушая процесс десериализации - PullRequest
0 голосов
/ 04 июля 2018

Я ищу решение для десериализации 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 Framework напрямую:

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.
  • Регистрация проблемы в файле журнала, чтобы я знал, что случилось что-то не так.

Я действительно не могу найти дорогу сейчас без огромных усилий, поэтому мне интересно, есть ли какое-нибудь готовое решение, сделайте это без переизобретения колеса.

1 Ответ

0 голосов
/ 10 июля 2018

Я предполагаю, что вы не хотите считать строку типа 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()));
    }
}

Надеюсь, это поможет!

...