Джексон игнорирует значение по умолчанию, когда это правда - PullRequest
0 голосов
/ 11 марта 2020

У меня есть класс со значением по умолчанию, равным true, и я хочу игнорировать значение по умолчанию при сериализации. Он работает, когда по умолчанию false, но не когда по умолчанию 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());
    }

, который выводит (после обмана немного):

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

Как я могу игнорировать значение по умолчанию, когда оно true?

1 Ответ

1 голос
/ 11 марта 2020

Вы можете использовать пользовательский фильтр, потому что NON_DEFAULT не учитывает то, что вы назначаете, но значение по умолчанию для типа оболочки.

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

}

ПРАВКА для полноты из javado c из JsonInclude.Include.NON_DEFAULT, выделено:

Когда НЕ используется для POJO (то есть как глобальное значение по умолчанию или как переопределение свойства ), определение таково: Все значения считаются «пустыми» (согласно NON_EMPTY) и исключаются, Значения по умолчанию для примитива / оболочки исключены , Значения даты / времени, которые имеют метку времени (long значение в миллисекундах с начала эпохи, см. Дата) 0L исключены

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...