Игнорировать отсутствующие свойства при десериализации Джексона JSON в Java
В примере
class Person {
String name;
int age;
}
Если у объекта JSON отсутствует свойство age,
{
name : John
}
Person person = objectMapper.readValue(jsonFileReader, Person.class);
он бросает JsonMappingException
о том, что не может десериализоваться. Есть ли аннотация для игнорирования пропущенных полей при десериализации?
Спасибо
Ответы
Ответ 1
Я думаю, что вы хотите
@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Person {
...
}
что способ Джексона 1.x. Я думаю, что есть новый способ в 2.x. Что-то вроде
@JsonInclude(Include.NON_NULL)
public class Person {
...
}
Они расскажут Джексону только о сериализации значений, которые не являются нулевыми, и не жалуются при десериализации отсутствующего значения. Я думаю, он просто установит его на Java по умолчанию.
Ответ 2
@JsonIgnoreProperties(ignoreUnknown = true)
на уровне класса работал для меня.
Ответ 3
Подход, основанный на аннотации, является лучшим способом игнорировать, но при необходимости. Ручной способ десериализации:
ObjectMapper mapper = new ObjectMapper().configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
Person person = mapper.readValue(jsonFileReader, Person.class);
Ответ 4
Современные версии (2.9.6) библиотек Джексона по умолчанию игнорируют отсутствующие свойства создателя. Однако, если для конфигурации ObjectMapper установлено значение:
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_MISSING_CREATOR_PROPERTIES, true);
Затем вы получите ошибку десериализации, если одно из свойств отсутствует.
Ответ 5
Я думаю, что вы хотели бы использовать аннотацию @JsonIgnore: https://fasterxml.github.io/jackson-annotations/javadoc/2.2.0/com/fasterxml/jackson/annotation/JsonIgnore.html
Ответ 6
Вы также можете изменить свой класс, чтобы использовать Integer вместо int, и в этом случае Джексон будет правильно обрабатывать нулевые/отсутствующие значения "age". Просто добавьте этот ответ для тех, кто ищет альтернативу, не связанную с использованием аннотаций.
class Person {
String name;
Integer age;
}