5

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

例子:

public class Foo {
    private boolean test;

    ... setters/getters ...
}

以下json应该可以工作:

{
    test: true
}

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

{
    test: 1
}

相同的:

{
    test: "1"
}

true基本上,如果有人提供与or不同的东西,我希望反序列化失败false。不幸的是,杰克逊将1其视为 true 和0as false。我找不到禁用这种奇怪行为的反序列化功能。

4

1 回答 1

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));

结果:

 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"])
于 2017-09-22T20:24:39.577 回答