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。我找不到禁用这种奇怪行为的反序列化功能。
可以禁用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)
| 归档时间: |
|
| 查看次数: |
2213 次 |
| 最近记录: |