Пользовательские поля JSON с ответом Джексона

У меня есть несколько RESTful WS, созданных с помощью Spring Boot, и один из методов конечной точки возвращает экземпляр некоторого класса, который затем будет преобразован в JSON с использованием встроенной библиотеки Джексона. Джексон преобразует в JSON каждое поле, даже если некоторые поля имеют значение NULL. На выходе это будет выглядеть так:

{
    "field1": "res1",
    "field2": "res2",
    "field3": null
}

Я хочу проигнорировать какое-то поле при выводе в определенных случаях. Не всегда, в некоторых случаях. Как это сделать?

поставил @JsonInclude(Include.NON_NULL) на класс

pvpkiran 27.08.2018 14:10
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
1 077
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вверху вашего класса добавьте аннотацию NON_NULL Джексона, чтобы игнорировать нулевые значения при получении или отправке

@JsonInclude(value = Include.NON_NULL)
public class SomeClass {
}

Чтобы подавить сериализацию свойств с нулевыми значениями с помощью Jackson> 2.0, вы можете настроить ObjectMapper напрямую или использовать аннотацию @JsonInclude:

mapper.setSerializationInclusion(Include.NON_NULL);

или:

@JsonInclude(Include.NON_NULL)
class Foo
{
  String field1;
  String field2;
  String field3;
}

В качестве альтернативы вы можете использовать @JsonInclude в геттере, чтобы атрибут отображался, если значение не равно нулю.

Полный пример доступен на Как предотвратить сериализацию нулевых значений внутри карты и нулевых полей внутри компонента через Джексон

Ответ принят как подходящий

Чтобы исключить нулевые значения, вы можете использовать

@JsonInclude(value = Include.NON_NULL)
public class YourClass {
}

А чтобы включить индивидуальные значения, вы можете использовать

public class Employee {
  private String name;
  @JsonInclude(value = JsonInclude.Include.CUSTOM, valueFilter = DateOfBirthFilter.class)
  private Date dateOfBirth;
  @JsonInclude(content = JsonInclude.Include.CUSTOM, contentFilter = PhoneFilter.class)
  private Map<String, String> phones;
}

public class DateOfBirthFilter {

  @Override
  public boolean equals(Object obj) {
      if (obj == null || !(obj instanceof Date)) {
          return false;
      }
      //date should be in the past
      Date date = (Date) obj;
      return !date.before(new Date());
  }
}

public class PhoneFilter {
  private static Pattern phonePattern = Pattern.compile("\\d{3}-\\d{3}-\\d{4}");

  @Override
  public boolean equals(Object obj) {
      if (obj == null || !(obj instanceof String)) {
          return false;
      }
      //phone must match the regex pattern
      return !phonePattern.matcher(obj.toString()).matches();
  }
}

Взял ссылку из https://www.logicbig.com/tutorials/misc/jackson/json-include-customized.html

Другие вопросы по теме