如何为杰克逊启用严格类型解析?

mag*_*air 5 java jax-rs jackson

Jackson 1.9.9在解析为标量值(布尔,整数,字符串)时有些不一致。任何数组或对象类型都会失败,但是您可以将任何标量类型放入字符串中。对于布尔值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
Run Code Online (Sandbox Code Playgroud)

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

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

Sta*_*Man 2

Jackson 数据绑定随着时间的推移而不断发展,可以接受更多的自动强制,尽管有一些功能 (DeserializationConfig.Feature.FAIL_ON_NULL_FOR_PRIMITIVES) 可以强制执行更严格的检查,但要求的功能并不多。

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

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

  • Java 的默认 JSON 解决方案怎么会表现得如此糟糕? (4认同)
  • 考虑是主观的。[隐式转换被认为是有害的](http://programmers.stackexchange.com/questions/284937/why-cant-there-be-any-implicit-conversions)很久以前。无论某些用户如何看待隐式转换的有用性,它们都会导致错误。对于没有布尔类型(或具有多个布尔类型)的语言,显式转换注释是唯一正确的方法。Jackson 的问题在于它不一致地实现了其中一些转换,否则需要对整个类型进行(反)序列化器,这就是我称之为行为不当的原因。 (2认同)