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

Джексон Игнорирует Свойства на Маршаллинге

1. обзор

Из этого туториала Вы узнаете, как использоватьignore certain fields when serializing an object to JSON с помощью Jackson 2.x.

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

Если вы хотите копнуть глубже и узнать о других интересных вещах, которые вы можете сделать с Джексоном, переходите кthe main Jackson tutorial.

Дальнейшее чтение:

Введение в Джексон ObjectMapper

В статье обсуждается центральный класс ObjectMapper Джексона, базовая сериализация и десериализация, а также настройка этих двух процессов.

Read more

Потоковое API Джексона

Краткий обзор Streaming API Джексона для обработки JSON, включая примеры

Read more

Руководство по @JsonFormat в Джексоне

Краткое и практическое руководство по аннотации @JsonFormat в Джексоне.

Read more

2. Игнорировать поля на уровне класса

Мы можем игнорировать определенные поля на уровне класса, используяthe @JsonIgnoreProperties annotation and specifying the fields by name:

@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. Игнорировать поле на уровне поля

Мы также можем игнорировать поле напрямую черезthe @JsonIgnore annotation directly on the field:

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. Игнорировать все поля по типу

Наконец, мы можемignore all fields of a specified type, using the @JsonIgnoreType annotation. Если мы контролируем тип, то мы можем напрямую аннотировать класс:

@JsonIgnoreType
public class SomeType { ... }

Однако чаще всего мы не контролируем сам класс; в этом случаеwe can make good use of Jackson mixins.

Сначала мы определяем MixIn для типа, который хотим игнорировать, и аннотируем его с помощью@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")));
}

и вот наш DTO:

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

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

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

Наконец,we can also use filters to ignore specific fields в Джексоне. Во-первых, нам нужно определить фильтр для объекта 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 и используем фильтры для большего контроля над выводом.

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