Как отключить преобразование 0/1 в true/false в jackson 2.9.x

У меня есть проект, которому нужна строгая политика json.

Пример:

public class Foo {
    private boolean test;

    ... setters/getters ...
}

Следующий json должен работать:

{
    test: true
}

И следующее должно потерпеть неудачу (сгенерировать исключение):

{
    test: 1
}

то же самое для:

{
    test: "1"
}

По сути, я хочу, чтобы десериализация потерпела неудачу, если кто-то предоставит что-то отличное от true или false. К сожалению, Джексон считает 1 правдой, а 0 - false. Я не смог найти функцию десериализации, отключающую это странное поведение.


person Krzysztof Krasoń    schedule 22.09.2017    source источник


Ответы (1)


Можно отключить MapperFeature.ALLOW_COERCION_OF_SCALARS From документы

Функция, которая определяет, разрешены ли приведения из вторичных представлений для простых нетекстовых скалярных типов: чисел и логических значений.

Если вы также хотите, чтобы это работало для null, включите DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES (Подробнее)

ObjectMapper mapper = new ObjectMapper();

//prevent any type as boolean
mapper.disable(MapperFeature.ALLOW_COERCION_OF_SCALARS);

// prevent null as false 
// mapper.enable(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES);

System.out.println(mapper.readValue("{\"test\": true}", Foo.class));
System.out.println(mapper.readValue( "{\"test\": 1}", Foo.class));

Результат:

 Foo{test=true} 

 Exception in thread "main"
 com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot
 coerce Number (1) for type `boolean` (enable
 `MapperFeature.ALLOW_COERCION_OF_SCALARS` to allow)  at [Source:
 (String)"{"test": 1}"; line: 1, column: 10] (through reference chain:
 Main2$Foo["test"])
person varren    schedule 22.09.2017
comment
Спасибо, это то, что мне было нужно. - person Krzysztof Krasoń; 23.09.2017
comment
Обратите внимание, что существует ошибка, из-за которой эта функция игнорируется, если вы включили афтерберер: github .com/FasterXML/jackson-modules-base/issues/69 - person Dan; 09.01.2019
comment
Спасибо чувак. Это работает как ад - person Anıl Şenocak; 26.02.2021