Автор оригинала: 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 .