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

В Jackson можно использовать аннотацию JsonSerialize для POJO для предотвращения сериализации нулевых объектов (@JsonSerialize (include = JsonSerialize.Inclusion.NON_NULL)). Однако примитивы не могут быть установлены в нуль, поэтому эта аннотация не работает для чего-то вроде int, который не был затронут и по умолчанию равен 0.

Есть ли аннотация, которая позволила бы мне сказать что-то вроде "Для этого класса не сериализуйте примитивы, если они не отличаются от значений по умолчанию" или "Для этого поля не сериализуйте его, если его значение равно X"?

Ответ 1

Если вы используете последнюю версию Jackson, вы можете использовать JsonInclude.Include.NON_DEFAULT, который должен работать для примитивов.

Недостатком этого подхода является то, что установка свойства bean в его значение по умолчанию не будет иметь никакого эффекта, и свойство все еще не будет включено:

@JsonInclude(Include.NON_DEFAULT)
public class Bean {
  private int val;
  public int getVal() { return val; }
  public void setVal(int val) { this.val = val; }
}

Bean b = new Bean();
b.setVal(0);
new ObjectMapper().writeValueAsString(b); // "{}" 

Ответ 2

Дело в том, что в Java загрузчик классов установил значение по умолчанию всех не инициализированных примитивных свойств (int = 0, boolean = false и т.д.), поэтому вы не можете отличить их от тех, которые явно установлены вашим приложение. По-моему, у вас есть два варианта:

  • Используйте соответствующие объекты-оболочки вместо примитивов (Integer, Boolean, Long..)
  • Как уже было предложено, определите собственный сериализатор