当boolean值类型的属性被定义为isXX时,有些序列化框架(如jackson)序列化过程中会把is省略,而有些框架(如gson)则不会,如下图
package com.juneyaoair.qwp.eurekaclient.bean;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
public class Apple {
private String color;
private int weight;
private boolean isSold;
private Boolean isGood;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
public boolean isSold() {
return isSold;
}
public void setSold(boolean sold) {
isSold = sold;
}
public Boolean getGood() {
return isGood;
}
public void setGood(Boolean good) {
isGood = good;
}
public static void main(String[] args) throws Exception{
ObjectMapper mapper = new ObjectMapper();
Apple apple = new Apple();
apple.setColor("red");
apple.setSold(true);
apple.setGood(true);
apple.setWeight(10);
String jsonValue = mapper.writeValueAsString(apple);
System.out.println(jsonValue);
System.out.println(new Gson().toJson(apple));
}
}
运行结果:
{"color":"red","weight":10,"good":true,"sold":true}
{"color":"red","weight":10,"isSold":true,"isGood":true}
原因:
jackson使用get/set方法为对象赋值而gson使用反射获取属性名为对象赋值。而javaBean的boolean类型属性的get方法为isXXX,如果你将属性名定义为isXXX时,get方法名就变成与属性名同名所以jackson框架就将属性序列化成XXX省略了is。
解决方案:
使用各框架的序列化别名注解直接指定想要的序列化名字,如jackson框架使用注解 @com.fasterxml.jackson.annotation.JsonProperty
思考:
既然会导致这样的问题就让我想到了编码规范,一些不规范的编码会导致某些框架出现不可预期的问题。于是我查了一下,布尔值类型的属性使用is开头来命名确实属于不规范的编码,阿里巴巴编码规范中明确规定boolean类型的属性不能使用is开头来命名。