查看阿里巴巴规范,可以看到有一条强制性的要求。
POJO
类中布尔类型的变量不要加is,第一次看到这个的时候有点懵。基本数据类型Boolean?Boolean不是boolean的包装类型吗,后发现这里应该是笔误了,应该是基本数据类型boolean。但是后面又是什么意思呢?我们做个实验来看一下
第一步:在pom.xml
中分别引入在java中常用的json解析框架。
<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.1</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.79</version>
</dependency>
第二步:添加一个用于测试的pojo类
class Course {
private boolean isExpire;
public boolean isExpire() {
return isExpire;
}
public void setExpire(boolean expire) {
isExpire = expire;
}
}
第三步:编写测试类,分别使用不同的框架进行测试
@Test
public void testJson() throws JsonProcessingException {
System.out.println("jackson");
System.out.println(new ObjectMapper().writeValueAsString(new Course()));
System.out.println("==========================");
System.out.println("gson");
System.out.println(new Gson().toJson(new Course()));
System.out.println("==========================");
System.out.println("fastjson");
System.out.println(JSON.toJSONString(new Course()));
}
查看控制台输出
jackson
{"expire":false}
==========================
gson
{"isExpire":false}
==========================
fastjson
{"expire":false}
根据控制台输出,可以看到:jackson和fastjson解析出来的json字段都叫expire
,而gson解析出来的字段叫isExpire
,所以我们可以推断出来jackson和fastjson都是利用其中的get方法进行解析的,而gson则是使用的字段名进行解析。
但是,如果把get方法也去掉,就会出问题了。
可以自己进行试验,结论就是:
对于jackson框架,如果没有get方法会抛出JsonProcessingException
;
对于gson框架,如果没有get方法也是能正常解析的,因为他是基于字段
解析的。
对于fsonjson框架,如果没有get方法返回{}
。
实验一:修改pojo的类型为Boolean
class Course {
private Boolean isExpire;
public Boolean getExpire() {
return isExpire;
}
public void setExpire(Boolean expire) {
isExpire = expire;
}
}
再次运行测试类,查看控制台输出
jackson
{"expire":null}
==========================
gson
{}
==========================
fastjson
{}
可以看到jackson解析出来了字段名为expire,并且值为null,这是因为jackson是使用get方法来解析的,而get方法叫做getExpire,所i有解析出来的字段名叫做expire,至于为什么是null是因为所有引用类型的默认值都是null
而gson和fastjson对于null值的属性则不进行解析了。
实验二:修改pojo的字段为expire,类型为boolean
class Course {
private boolean expire;
public boolean isExpire() {
return expire;
}
public void setExpire(boolean expire) {
this.expire = expire;
}
}
运行测试类,查看测试结果。
jackson
{"expire":false}
==========================
gson
{"expire":false}
==========================
fastjson
{"expire":false}
可以看到,三种框架解析出来的结果都是一样的。那如果是引用类型的Boolean呢?
实验三:修改pojo的字段为expire,类型为Boolean
class Course {
private Boolean expire;
public Boolean getExpire() {
return expire;
}
public void setExpire(Boolean expire) {
this.expire = expire;
}
}
jackson
{"expire":null}
==========================
gson
{}
==========================
fastjson
{}
可以看到,和实验一的结果是一样的。