在Jackson中,可以在POJO上使用JsonSerialize注解,以防止null对象被序列化(@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL))。但是,原语不能设置为null,因此该注解不适用于未被触及的int,默认值为0。是否有一个注解允许我说“对于这个类,不要序列化基元,除非它们不同于它们的默认值”或“对于这个字段,如果它的值是X,不要序列化它”?
lymnna711#
如果你使用的是Jackson的最新版本,你可以使用JsonInclude.Include.NON_DEFAULT,它应该可以用于原语。此方法的缺点是将Bean属性设置为默认值将不起作用,并且仍不会包含该属性:
JsonInclude.Include.NON_DEFAULT
@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); // "{}"
vulvrdjw2#
事实上,在Java中,类加载器会将所有未初始化的原语属性设置为默认值(int = 0,boolean = false等),因此您无法将它们与应用程序显式设置的属性区分开来。在我看来,您有两种选择:
uplii1fm3#
@JsonInclude(value = JsonInclude.Include.NON_DEFAULT). //这是用于图元得.@JsonInclude(内容= JsonInclude.包含.非默认)。
@JsonInclude(value = JsonInclude.Include.NON_DEFAULT)
1.全局默认值:ObjectMapper.setDefaultPropertyInclusion(...)-如果没有其他设置适用,则使用
3条答案
按热度按时间lymnna711#
如果你使用的是Jackson的最新版本,你可以使用
JsonInclude.Include.NON_DEFAULT
,它应该可以用于原语。此方法的缺点是将Bean属性设置为默认值将不起作用,并且仍不会包含该属性:
vulvrdjw2#
事实上,在Java中,类加载器会将所有未初始化的原语属性设置为默认值(int = 0,boolean = false等),因此您无法将它们与应用程序显式设置的属性区分开来。在我看来,您有两种选择:
uplii1fm3#
类或属性级别:(您也可以全局配置或按类型配置,如here所示)
@JsonInclude(value = JsonInclude.Include.NON_DEFAULT)
. //这是用于图元得.@JsonInclude(内容= JsonInclude.包含.非默认)。
按优先级递增顺序:
1.全局默认值:ObjectMapper.setDefaultPropertyInclusion(...)-如果没有其他设置适用,则使用
1.依类型包含预设值:ObjectMapper.configOverride(MyValue.class).setInclude(...),类似地为指定的类型指定包含(但覆盖全局默认值和可能的每个类的注解)
1.每个属性包含覆盖:属性存取子(字段、setter/getter、建构函式参数)上的@JsonInclude-覆写其他3个层级的预设值