如何使jackson不使用默认值序列化基元

gal*_*ise 14 java json jackson

在Jackson中,可以在POJO上使用JsonSerialize注释,以防止空对象被序列化(@JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)).但是,基元不能设置为null,因此这个注释不适用于类似未触及的int并且默认为0的内容.

是否有一个注释可以让我说"对于这个类,不要序列化基元,除非它们的默认值不同"或"对于这个字段,如果它的值是X,不要序列化它"?

HiJ*_*n89 25

如果您使用的是最新版本的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); // "{}" 
Run Code Online (Sandbox Code Playgroud)


car*_*ini 7

事实是,在Java中,类加载器将设置为默认值所有未初始化的基本属性(int = 0,boolean = false等...),因此您无法将它们与应用程序明确设置的区分开来.在我看来,你有两个选择:

  • 使用相应的包装器对象而不是基元(Integer,Boolean,Long ..)
  • 如前所述,定义自定义序列化程序