如何使 jackson 不序列化具有默认值的基元

2022-09-02 12:14:20

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

有没有一个注释可以让我说“对于这个类,不要序列化基元,除非它们与它们的默认值不同”或“对于这个字段,如果它的值为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,布尔值= false等),因此您无法将它们与应用程序显式设置的属性区分开来。在我看来,你有两个选择:

  • 使用相应的包装对象而不是基元(整数,布尔值,长整型..)
  • 如前所述,定义自定义序列化程序