Перейти к основному содержимому

Jackson Ignore Properties на Marshalling

· 4 мин. чтения

Задача: Медиана двух отсортированных массивов

Даны два отсортированных массива размерами n и m. Найдите медиану слияния этих двух массивов.
Временная сложность решения должна быть O(log(m + n)) ...

ANDROMEDA

1. Обзор

В этом руководстве показано, как игнорировать определенные поля при сериализации объекта в JSON с использованием Jackson 2.x.

Это очень полезно, когда значений по умолчанию Джексона недостаточно, и нам нужно точно контролировать, что сериализуется в JSON — и есть несколько способов игнорировать свойства.

Чтобы копнуть глубже и узнать о других интересных вещах, которые мы можем делать с Джексоном, перейдите к основному учебнику по Джексону .

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 { ... }

Однако чаще всего у нас нет контроля над самим классом. В этом случае мы можем хорошо использовать примеси Джексона.

Во-первых, мы определяем MixIn для типа, который мы хотели бы игнорировать, и вместо этого аннотируем его с помощью @JsonIgnoreType :

@JsonIgnoreType
public class MyMixInForIgnoreType {}

Затем мы регистрируем этот миксин для замены (и игнорирования) всех типов String[] во время маршалинга:

mapper.addMixInAnnotations(String[].class, MyMixInForIgnoreType.class);

На этом этапе все массивы String будут игнорироваться, а не маршалироваться в 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")));
}

А вот и наш DTO:

public class MyDtoWithSpecialField {
private String[] stringValue;
private int intValue;
private boolean booleanValue;
}

Примечание. Начиная с версии 2.5 кажется, что мы не можем использовать этот метод для игнорирования примитивных типов данных, но мы можем использовать его для пользовательских типов данных и массивов.

5. Игнорировать поля с помощью фильтров

Наконец, мы также можем использовать фильтры, чтобы игнорировать определенные поля в Джексоне.

Во-первых, нам нужно определить фильтр для объекта Java:

@JsonFilter("myFilter")
public class MyDtoWithFilter { ... }

Затем мы определяем простой фильтр, который будет игнорировать поле intValue :

SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter
.serializeAllExcept("intValue");
FilterProvider filters = new SimpleFilterProvider()
.addFilter("myFilter", theFilter);

Теперь мы можем сериализовать объект и убедиться, что поле intValue отсутствует в выводе 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 с MixIns и использовали фильтры для большего контроля вывода.

Реализацию всех этих примеров и фрагментов кода можно найти в проекте GitHub .