8

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

4

2 回答 2

4

FWIW,如果您像我一样在很久以后遇到这种情况,ALLOW_COERCION_OF_SCALARS将通过减少杰克逊为您执行的转换次数而有所帮助,尽管它远非完全严格的模式;许多类型强制仍然会执行,但有些会被阻止。链接的文档涉及一些细节。

于 2018-11-27T21:54:22.377 回答
2

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

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

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

于 2012-09-22T23:04:38.723 回答