Java jackson在使用默认值时忽略它';这是真的
我有一个类的默认值是Java jackson在使用默认值时忽略它';这是真的,java,jackson,Java,Jackson,我有一个类的默认值是true,我想忽略序列化中的默认值。当默认值为false时,它工作,但当默认值为true时不工作: 公共静态最终类TestBooleanDefaultTrue{ @JsonInclude(Include.NON_默认值) @JsonProperty(value=“display”) 公共布尔显示=Boolean.TRUE; 公共字符串s=“test”; 公共TestBooleanDefaultTrue(){} } 公共静态最终类TestBooleanDefaultFalse{
true
,我想忽略序列化中的默认值。当默认值为false
时,它工作,但当默认值为true
时不工作:
公共静态最终类TestBooleanDefaultTrue{
@JsonInclude(Include.NON_默认值)
@JsonProperty(value=“display”)
公共布尔显示=Boolean.TRUE;
公共字符串s=“test”;
公共TestBooleanDefaultTrue(){}
}
公共静态最终类TestBooleanDefaultFalse{
@JsonInclude(Include.NON_默认值)
@JsonProperty(value=“display”)
公共布尔显示=Boolean.FALSE;
公共字符串s=“test”;
公共TestBooleanDefaultFalse(){}
}
@试验
public void readBVMTest()抛出JsonGenerationException、JsonMappingException、IOException{
writeValue(System.out,新的TestBooleanDefaultTrue());
writeValue(System.out,新的TestBooleanDefaultFalse());
}
哪种输出(欺骗一点后):
我如何忽略默认值,当它是代码>真的< /代码>?< /p> < p>您可以使用自定义筛选器,因为<代码>非默认默认值不考虑您所分配的,而是包装类型的默认值。
public static final class MyFilter {
@Override
public boolean equals(final Object obj) {
if (obj == null || !(obj instanceof Boolean)) {
return false;
}
// date should be in the past
final Boolean v = (Boolean) obj;
return Boolean.TRUE.equals(v);
}
}
public static final class TestBooleanDefaultTrue {
@JsonInclude(value = Include.CUSTOM, valueFilter = MyFilter.class)
@JsonProperty(value = "display")
public Boolean display = Boolean.TRUE;
public String s = "test";
public TestBooleanDefaultTrue() {
}
}
public static final class TestBooleanDefaultFalse {
@JsonInclude(Include.NON_DEFAULT)
@JsonProperty(value = "display")
public Boolean display = Boolean.FALSE;
public String s = "test";
public TestBooleanDefaultFalse() {
}
}
@Test
public void readBVMTest() throws JsonGenerationException, JsonMappingException, IOException {
assertEquals(getOM().writeValueAsString(new TestBooleanDefaultTrue()), "{\"s\":\"test\"}");
assertEquals(getOM().writeValueAsString(new TestBooleanDefaultFalse()), "{\"s\":\"test\"}");
}
从JsonInclude.Include.NON_DEFAULT
的javadoc中编辑完整性,重点是:
当不用于POJO(即,作为全局默认值或属性重写)时,定义如下:
所有被视为“空”(根据非空)的值均被排除在外,
不包括基元/包装器默认值,
时间戳为0L
的日期/时间值(long
自历元起的毫秒值,请参见日期)被排除在外
您可以查看
JsonInclude.Include.CUSTOM
并通过valueFilter
,s.t指定一个筛选器类。当值为布尔值时,它会进行筛选。TRUE
好的,我想我明白了。。。如果我看,我读>当用于POJO时。。。我以为我是这样的,但我意识到我是在财产层面,而不是POJO层面。好的,谢谢!
public static final class MyFilter {
@Override
public boolean equals(final Object obj) {
if (obj == null || !(obj instanceof Boolean)) {
return false;
}
// date should be in the past
final Boolean v = (Boolean) obj;
return Boolean.TRUE.equals(v);
}
}
public static final class TestBooleanDefaultTrue {
@JsonInclude(value = Include.CUSTOM, valueFilter = MyFilter.class)
@JsonProperty(value = "display")
public Boolean display = Boolean.TRUE;
public String s = "test";
public TestBooleanDefaultTrue() {
}
}
public static final class TestBooleanDefaultFalse {
@JsonInclude(Include.NON_DEFAULT)
@JsonProperty(value = "display")
public Boolean display = Boolean.FALSE;
public String s = "test";
public TestBooleanDefaultFalse() {
}
}
@Test
public void readBVMTest() throws JsonGenerationException, JsonMappingException, IOException {
assertEquals(getOM().writeValueAsString(new TestBooleanDefaultTrue()), "{\"s\":\"test\"}");
assertEquals(getOM().writeValueAsString(new TestBooleanDefaultFalse()), "{\"s\":\"test\"}");
}