问题

在开发过程中,发现某个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

WX20220729-154248