如何为jackson启用严格类型解析?

时间:2012-09-22 18:58:12

标签: java jax-rs jackson

Jackson 1.9.9在解析标量值(bool,int,string)方面有些不一致。任何数组或对象类型都会失败,但您可以将任何标量类型放入字符串中。对于bool 0而不是0映射到false / true。 int属性只接受数字。

public class Foo { public String s; public boolean b; public int i; }

ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.readValue("{\"s\":\"abc\"}", Foo.class).s); // "abc"
System.out.println(mapper.readValue("{\"s\":true}", Foo.class).s); // "true"
System.out.println(mapper.readValue("{\"s\":123}", Foo.class).s); // "123"
System.out.println(mapper.readValue("{\"b\":123}", Foo.class).b); // true
System.out.println(mapper.readValue("{\"b\":0}", Foo.class).b); // false
System.out.println(mapper.readValue("{\"b\":\"abc\"}", Foo.class).b); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"i\":\"abc\"}", Foo.class).i); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"i\":true}", Foo.class).i); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"s\":[]}", Foo.class).s); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"s\":{}}", Foo.class).s); // fails  with JsonMappingException
System.out.println(mapper.readValue("{\"b\":[]}", Foo.class).b); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"b\":{}}", Foo.class).b); // fails  with JsonMappingException
System.out.println(mapper.readValue("{\"i\":[]}", Foo.class).i); // fails with JsonMappingException
System.out.println(mapper.readValue("{\"i\":{}}", Foo.class).i); // fails  with JsonMappingException

Jackson是否有严格模式,以便在有人将一个布尔值传递给String属性时出现错误?

我在JAX-RS项目中使用它,这使得基于杰克逊抛出的异常的错误报告有点困难,因为我得到了大部分错误但不是全部错误。我想避免获取原始ObjectNode并手动检查所有内容。如果调用者传递一个字符串的布尔值,那么我想告诉他,因为这很可能是一个编程错误。

2 个答案:

答案 0 :(得分:1)

杰克逊数据绑定随着时间的推移不断增长,可以接受更多的自动强制攻击,虽然有一些功能(DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES)可以执行更严格的检查,但并没有多少请求。

鉴于此,您最好为要更严格的类型注册自定义JsonDeserializer,例如boolean / Boolean。你可以在那里实施更严格的检查。

此外,您可以请求更严格的限制功能:我认为这对某些用例有意义,尤其是。如果更宽松的转换可以隐藏真正的问题。

答案 1 :(得分:0)

FWIW,如果您像我一样晚了这么晚,ALLOW_COERCION_OF_SCALARS