Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java jackson在使用默认值时忽略它';这是真的_Java_Jackson - Fatal编程技术网

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\"}");

}