POJO类中的布尔类型

阿里巴巴开发手册中:

“POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。反例:定义为基本数据类型boolean isSuccess 的属性,它的方法也是isSuccess(),RPC框架在反向解析的时候,以为对应的属性名称是success,导致属性获取不到,进而抛出异常”。

package org.cjr.test.testmodel;

import java.io.IOException;
import java.io.Serializable;

import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;

public class BooleanTest {
	
	public static void main(String[] args) throws IOException {
		 Model model  =  new Model();
		 model.setSuccess(true);
		 Gson gson =new Gson();
		 
		/**根据{“success”:true}这个json串,Gson框架在通过解析后,通过反射寻找Model类中的success属性,
		但是Model类中只有isSuccess属性,所以,最终反序列化后的Model类的对象中,isSuccess则会使用默认值false。
		 * 
		 */
		 System.out.println(gson.fromJson(JSON.toJSONString(model), Model.class));
		 
		 System.out.println(gson.toJson(model));
	}

}
class Model implements Serializable
{
	private boolean isSuccess;
    public boolean isSuccess() {
        return isSuccess;
    }
    public void setSuccess(boolean success) {
        isSuccess = success;
    }

    public String toString() {
        return String.valueOf(isSuccess);
    }
	
}

运行结果如下

根据{“success”:true}这个json串,Gson框架在通过解析后,通过反射寻找Model类中的success属性,
 但是Model类中只有isSuccess属性,所以,最终反序列化后的Model类的对象中,isSuccess则会使用默认值false。

 

所以,作为开发者,我们应该想办法尽量避免这种问题的发生,对于POJO的设计者来说,只需要做简单的一件事就可以解决这个问题了,那就是把isSuccess改为success。这样,该类里面的成员变量时success,getter方法是isSuccess,这是完全符合JavaBeans规范的。无论哪种序列化框架,执行结果都一样。就从源头避免了这个问题。

package org.cjr.test.testmodel;

import java.io.IOException;
import java.io.Serializable;

import com.alibaba.fastjson.JSON;
import com.google.gson.Gson;

public class BooleanTest {
	
	public static void main(String[] args) throws IOException {
		 Model model  =  new Model();
		 model.setSuccess(true);
		 Gson gson =new Gson();
		 
		/**根据{“success”:true}这个json串,Gson框架在通过解析后,通过反射寻找Model类中的success属性,
		但是Model类中只有isSuccess属性,所以,最终反序列化后的Model类的对象中,isSuccess则会使用默认值false。
		 * 
		 */
		 System.out.println(gson.fromJson(JSON.toJSONString(model), Model.class));
		 
		 System.out.println(gson.toJson(model));
	}

}
class Model implements Serializable
{
	private boolean success;
    public boolean isSuccess() {
        return success;
    }
    public void setSuccess(boolean success) {
        this.success = success;
    }

    public String toString() {
        return String.valueOf(success);
    }
	
}

©️2020 CSDN 皮肤主题: 岁月 设计师:pinMode 返回首页