Подтвердить что ты не робот

Игнорировать отсутствующие свойства при десериализации Джексона JSON в Java

В примере

class Person {
   String name;
   int age;
}

Если у объекта JSON отсутствует свойство age,

{
  name : John
}

Person person = objectMapper.readValue(jsonFileReader, Person.class);

он бросает JsonMappingException о том, что не может десериализоваться. Есть ли аннотация для игнорирования пропущенных полей при десериализации?

Спасибо

4b9b3361

Ответ 1

Я думаю, что вы хотите

@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
public class Person {
  ...
}

что способ Джексона 1.x. Я думаю, что есть новый способ в 2.x. Что-то вроде

@JsonInclude(Include.NON_NULL)
public class Person {
  ...
}

Они расскажут Джексону только о сериализации значений, которые не являются нулевыми, и не жалуются при десериализации отсутствующего значения. Я думаю, он просто установит его на Java по умолчанию.

Ответ 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);

Затем вы получите ошибку десериализации, если одно из свойств отсутствует.

Ответ 6

Вы также можете изменить свой класс, чтобы использовать Integer вместо int, и в этом случае Джексон будет правильно обрабатывать нулевые/отсутствующие значения "age". Просто добавьте этот ответ для тех, кто ищет альтернативу, не связанную с использованием аннотаций.

class Person {
   String name;
   Integer age;
}