如何使Jackson不使用默认值序列化原语

njthzxwz  于 2022-11-08  发布在  其他
关注(0)|答案(3)|浏览(213)

在Jackson中,可以在POJO上使用JsonSerialize注解,以防止null对象被序列化(@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL))。但是,原语不能设置为null,因此该注解不适用于未被触及的int,默认值为0。
是否有一个注解允许我说“对于这个类,不要序列化基元,除非它们不同于它们的默认值”或“对于这个字段,如果它的值是X,不要序列化它”?

lymnna71

lymnna711#

如果你使用的是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); // "{}"
vulvrdjw

vulvrdjw2#

事实上,在Java中,类加载器会将所有未初始化的原语属性设置为默认值(int = 0,boolean = false等),因此您无法将它们与应用程序显式设置的属性区分开来。在我看来,您有两种选择:

  • 使用相应的 Package 对象而不是基元(整型、布尔型、长整型..)
  • 正如已经建议的那样,定义一个自定义序列化程序
uplii1fm

uplii1fm3#

类或属性级别:(您也可以全局配置或按类型配置,如here所示)

@JsonInclude(value = JsonInclude.Include.NON_DEFAULT). //这是用于图元得.
@JsonInclude(内容= JsonInclude.包含.非默认)。

按优先级递增顺序:

1.全局默认值:ObjectMapper.setDefaultPropertyInclusion(...)-如果没有其他设置适用,则使用

  1. Per-class @JsonInclude注解(指定要注解之类别的预设包含(覆写全域预设))
    1.依类型包含预设值:ObjectMapper.configOverride(MyValue.class).setInclude(...),类似地为指定的类型指定包含(但覆盖全局默认值和可能的每个类的注解)
    1.每个属性包含覆盖:属性存取子(字段、setter/getter、建构函式参数)上的@JsonInclude-覆写其他3个层级的预设值

相关问题