Автор оригинала: Eugen Paraschiv.
1. Обзор
В этом уроке будет показано, как игнорировать определенные поля при сериализации объекта в JSON с помощью Jackson 2.x.
Это очень полезно, когда значений по умолчанию Джексона недостаточно, и нам нужно точно контролировать, что сериализуется в JSON – и есть несколько способов игнорировать свойства.
Если вы хотите копнуть глубже и узнать другие интересные вещи, которые вы можете сделать с помощью Джексона, перейдите к основному учебнику по Джексону .
Дальнейшее чтение:
Введение в приложение для отображения объектов Джексона
API потоковой передачи Джексона
Руководство по @JsonFormat в Джексоне
2. Игнорируйте поля на уровне класса
Мы можем игнорировать определенные поля на уровне класса, используя аннотацию @ JsonIgnoreProperties и указывая поля по имени :
@JsonIgnoreProperties(value = { "intValue" }) public class MyDto { private String stringValue; private int intValue; private boolean booleanValue; public MyDto() { super(); } // standard setters and getters are not shown }
Теперь мы можем проверить, что после записи объекта в JSON поле действительно не является частью выходных данных:
@Test public void givenFieldIsIgnoredByName_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { ObjectMapper mapper = new ObjectMapper(); MyDto dtoObject = new MyDto(); String dtoAsString = mapper.writeValueAsString(dtoObject); assertThat(dtoAsString, not(containsString("intValue"))); }
3. Игнорируйте поле на уровне поля
Мы также можем игнорировать поле напрямую через @ JsonIgnore аннотацию непосредственно на поле :
public class MyDto { private String stringValue; @JsonIgnore private int intValue; private boolean booleanValue; public MyDto() { super(); } // standard setters and getters are not shown }
Теперь мы можем проверить, что поле intValue действительно не является частью сериализованного вывода JSON:
@Test public void givenFieldIsIgnoredDirectly_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { ObjectMapper mapper = new ObjectMapper(); MyDto dtoObject = new MyDto(); String dtoAsString = mapper.writeValueAsString(dtoObject); assertThat(dtoAsString, not(containsString("intValue"))); }
4. Игнорируйте все поля по типу
Наконец, мы можем игнорировать все поля указанного типа, используя @ JsonIgnoreType аннотацию . Если мы контролируем тип, то мы можем напрямую аннотировать класс:
@JsonIgnoreType public class SomeType { ... }
Однако чаще всего мы не контролируем сам класс; в этом случае мы можем хорошо использовать Джексона миксина .
Во-первых, мы определяем миксин для типа, который мы хотели бы игнорировать, и вместо этого аннотируем его с помощью @JsonIgnoreType :
@JsonIgnoreType public class MyMixInForIgnoreType {}
Затем мы регистрируем этот микс, чтобы заменить (и игнорировать) все типы String[] во время маршалинга:
mapper.addMixInAnnotations(String[].class, MyMixInForIgnoreType.class);
На этом этапе все строковые массивы будут игнорироваться, а не маршалироваться в JSON:
@Test public final void givenFieldTypeIsIgnored_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { ObjectMapper mapper = new ObjectMapper(); mapper.addMixIn(String[].class, MyMixInForIgnoreType.class); MyDtoWithSpecialField dtoObject = new MyDtoWithSpecialField(); dtoObject.setBooleanValue(true); String dtoAsString = mapper.writeValueAsString(dtoObject); assertThat(dtoAsString, containsString("intValue")); assertThat(dtoAsString, containsString("booleanValue")); assertThat(dtoAsString, not(containsString("stringValue"))); }
и вот наш К:
public class MyDtoWithSpecialField { private String[] stringValue; private int intValue; private boolean booleanValue; }
Примечание: Начиная с версии 2.5 – похоже, что мы не можем использовать этот метод для игнорирования примитивных типов данных, но мы можем использовать его для пользовательских типов данных и массивов.
5. Игнорируйте Поля С Помощью Фильтров
Наконец, мы также можем использовать фильтры для игнорирования определенных полей в Джексоне. Во – первых, нам нужно определить фильтр для объекта Java:
@JsonFilter("myFilter") public class MyDtoWithFilter { ... }
Затем мы определяем простой фильтр, который будет игнорировать значение int поля:
SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept("intValue"); FilterProvider filters = new SimpleFilterProvider() .addFilter("myFilter", theFilter);
Теперь мы можем сериализовать объект и убедиться, что поле int Значение отсутствует в выводе JSON:
@Test public final void givenTypeHasFilterThatIgnoresFieldByName_whenDtoIsSerialized_thenCorrect() throws JsonParseException, IOException { ObjectMapper mapper = new ObjectMapper(); SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter .serializeAllExcept("intValue"); FilterProvider filters = new SimpleFilterProvider() .addFilter("myFilter", theFilter); MyDtoWithFilter dtoObject = new MyDtoWithFilter(); String dtoAsString = mapper.writer(filters).writeValueAsString(dtoObject); assertThat(dtoAsString, not(containsString("intValue"))); assertThat(dtoAsString, containsString("booleanValue")); assertThat(dtoAsString, containsString("stringValue")); System.out.println(dtoAsString); }
6. Заключение
В статье показано, как игнорировать поля при сериализации – сначала по имени, затем напрямую и, наконец, – мы проигнорировали весь тип java с помощью миксинов и используем фильтры для большего контроля вывода.
Реализацию всех этих примеров и фрагментов кода можно найти в моем проекте GitHub .