Я пытаюсь десериализовать структуру JSON с Джексоном, и я работаю с DTO, который выглядит так:
public class RootLevelDTO {
private List<ComplexEntry> complexEntries;
// ... other fields, not relevant
}
Теперь у ComplexEntry
могут быть подтипы, у них есть свойства типов enum и т. д. Здесь многое может пойти не так, если другая сторона связи обновит свой API и, например, добавляет еще один подтип или добавляет литерал перечисления.
Что я хотел бы сделать, так это сказать Джексону:
- если вы столкнулись с какой-либо ошибкой привязки данных во время десериализации поля
complexEntries
... - ... не не выдавать исключение, а вместо этого игнорировать эту запись и переходить к следующей.
До сих пор я пытался использовать делегирующий десериализатор для ComplexEntry
:
public class ComplexEntryDeserializer extends StdDeserializer<ComplexEntry> {
private StdDeserializer<ComplexEntry> delegate;
public ComplexEntryDeserializer(StdDeserializer<ComplexEntry> delegate){
this.delegate = delegate;
}
public ComplexEntry deserialize(JsonParser p, DeserializationContext ctxt){
try {
return this.delegate.deserialize(p, ctxt);
}catch(Exception e){
// the list entry failed to deserialize, but we have to return *something* here
return null;
}
}
// ... other mandatory methods, not relevant here
}
У этого решения есть проблема, заключающаяся в том, что оно вводит значения null
в список complexEntries
, от которых я затем должен явно избавиться с помощью Converter
.
Есть ли более элегантное решение этой проблемы?
Map<String, Object>
. Тогда синтаксический анализ никогда не даст сбоев, и все (неизвестные) данные будут проанализированы правильно. См., например. 3.3. @JsonAnySetter в статье «Примеры аннотаций Джексона» в Baeldung. - person Andreas   schedule 24.08.2020switch
и помещаете обработку ошибок в предложениеdefault
. Ошибка может объяснить, какое поле имеет неизвестное значение. - person Andreas   schedule 24.08.2020