Как сделать джексон не сериализацией примитивов со значением по умолчанию
В 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..)
- Как уже было предложено, определите собственный сериализатор