问题
在开发过程中,发现某个api在请求时传的是Integer,在另一个服务接收时,通过Boolean接收的,并且能正常转换为Boolean,故复现一下该问题,并探究下问题根本
依赖
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.8</version>
</dependency>
代码
public class StringApp {
private static final ObjectMapper mapper = new ObjectMapper();
public static void main(String[] args) throws Exception {
String beanString = "{\"name\":\"A\",\"sex\":0}";
Person bean = mapper.readValue(beanString, Person.class);
System.out.println("sex 1:" + bean.sex);
beanString = "{\"name\":\"A\",\"sex\":1}";
bean = mapper.readValue(beanString, Person.class);
System.out.println("sex 2:" + bean.sex);
}
}
class Person {
@JsonProperty("name")
String name;
@JsonProperty("sex")
Boolean sex;
}
打印结果输出
sex 1: false
sex 2: true
探究源码
- 在执行
mapper.readValue
过程中,发现sex是个数字,并且目标字段是Boolean故会通过NumberDeserializers$BooleanDeserializer解析该字段 - 在该方法中会校验值是否为TRUE OR FALSE
- 如果不是则通过
this._parseBoolean(p, ctxt)
转换,该方法也非常简单,如果不是0则为true,否则为false