Рубрики
Без рубрики

Джексон Игнорирует свойства при сортировке

Управляйте выводом JSON – Игнорируйте определенные поля напрямую, по имени или по типу (с помощью миксинов) для Jackson bliss.

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