Saya memiliki kelas yang memiliki nilai default yaitu true dan saya ingin mengabaikan default dalam serialisasi. Ini berfungsi ketika defaultnya adalah false, tetapi tidak ketika defaultnya adalah true:

    public static final class TestBooleanDefaultTrue {
        @JsonInclude(Include.NON_DEFAULT)
        @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 {
        testom.writeValue(System.out, new TestBooleanDefaultTrue());
        testom.writeValue(System.out, new TestBooleanDefaultFalse());
    }

Yang menghasilkan (setelah sedikit curang):

{"s":"test","display":true}
{"s":"test"}

Bagaimana saya bisa mengabaikan nilai default saat itu true?

0
Elie Roux 11 Maret 2020, 15:56

1 menjawab

Jawaban Terbaik

Anda dapat menggunakan filter khusus, karena NON_DEFAULT tidak mempertimbangkan apa yang Anda tetapkan, tetapi nilai default dari jenis pembungkus.

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

}

EDIT untuk kelengkapan dari javadoc JsonInclude.Include.NON_DEFAULT, tekankan milik saya:

Ketika TIDAK digunakan untuk POJO (yaitu, sebagai default global, atau sebagai penggantian properti), definisi adalah sedemikian rupa sehingga: Semua nilai yang dianggap "kosong" (sesuai NON_EMPTY) dikecualikan, Nilai default primitif/pembungkus dikecualikan, Nilai tanggal/waktu yang memiliki stempel waktu (long nilai milidetik sejak zaman, lihat Tanggal) sebesar 0L dikecualikan

1
sfiss 11 Maret 2020, 15:12