引入
为什么要讲这个问题呢?项目遇到一个boolean值,结果使用fastjson将对象转换为json字符串时发现boolean值的字段变了。
具体看如下示例代码:
/**
* 测试boolean值命名不规范导致的问题
* @ClassName Test
* @author zhangshun
* @date 2017年8月16日 下午5:40:13
*/
public class Test {
/**
* 命名不规范,不应该加is
*/
private boolean isTest;
/**
* 命名规范
*/
private boolean url;
// 以下是Eclipse生成的isTest的setter/getter方法,很明显,也跟着出问题
public boolean isTest() {
return isTest;
}
public void setTest(boolean isTest) {
this.isTest = isTest;
}
// 这个是正常的
public boolean isUrl() {
return url;
}
public void setUrl(boolean url) {
this.url = url;
}
public static void main(String[] args) {
Test test = new Test();
test.setTest(false);
test.setUrl(true);
// 结果:{"test":false,"url":true}, 很明显isTest变成了test
System.out.println(JSON.toJSONString(test));
}
}
这里,结果出现了变化!
原因
因为boolean值属性没有按照JavaBean规范进行命名。JavaBean规范这样说:如果一个属性是boolean值,假设名为property,则其setter方法应该是setProperty,其getter方法应该为isProperty。
当我们对isTest这个boolean类型的属性使用Eclipse自动生成setter/getter方法时,其生成的getter方法时isTest,这样的话,fastjson就会以为这个属性是test,从而输出结果是test。
解决
- 方式1:规范boolean值命名,将isTest调整为test,这样其结果为{“test”:false,”url”:true}
- 方式2:规范boolean值的getter方法,将isTest调整为isIsTest方法,这样其结果为{“isTest”:false,”url”:true}