如何在 jackson 2.9.x 中禁用 0/1 到 true/false 的转换

Krz*_*soń 3 java json jackson jackson2

我有一个需要严格 json 政策的项目。

例子:

public class Foo {
    private boolean test;

    ... setters/getters ...
}
Run Code Online (Sandbox Code Playgroud)

以下 json 应该可以工作:

{
    test: true
}
Run Code Online (Sandbox Code Playgroud)

并且以下应该失败(抛出异常):

{
    test: 1
}
Run Code Online (Sandbox Code Playgroud)

同样适用于:

{
    test: "1"
}
Run Code Online (Sandbox Code Playgroud)

基本上,如果有人提供与true或不同的东西,我希望反序列化失败false。不幸的是杰克逊对待1真实与0作为false。我找不到禁用这种奇怪行为的反序列化功能。

var*_*ren 5

可以禁用MapperFeature.ALLOW_COERCION_OF_SCALARS 来自文档

确定是否允许来自辅助表示的强制转换用于简单的非文本标量类型:数字和布尔值。

如果您还希望它适用于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));
Run Code Online (Sandbox Code Playgroud)

结果:

 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"])
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您启用了 afterburner,则会忽略此功能的错误:https://github.com/FasterXML/jackson-modules-base/issues/69 (2认同)