fastjson 1.2.47升级到1.2.60版本使用toJavaObject,如果Bean中属性有Set方法则Set方法不执行

envsm3lx  于 2021-11-27  发布在  Java
关注(0)|答案(3)|浏览(369)

1.2.47升级到1.2.60版本以后,代码中JSON.toJavaObject(jsonojbect, Bean.class); 如果Bean中属性有Set方法则Set方法没有执行,1.2.47版本没有问题,1.2.60版本出现问题,相应的getObject方法也会出现这样的问题,其他版本没有尝试

@DaTa
public class FastJson {

private String lasttime;

private String nums;

public String getLasttime() {
	return lasttime;
}

public void setLasttime(String lasttime) {
	System.out.println("1123123");
	this.lasttime = lasttime;
}

}

//FastJson fastJson = new FastJson();
	// fastJson.setLasttime("12312555");
	// fastJson.setNums("123");
	// JSONObject jsobj =  JSON.parseObject(JSON.toJSONString(fastJson));

	//String string1 = JSON.toJSONString(fastJson);
	//System.out.println(string1);
	String string = "{\"lasttime\":\"12312\",\"nums\":\"123\"}";
	JSONObject jsobj =  JSON.parseObject(string);
	FastJson fj = JSON.toJavaObject(jsobj, FastJson.class);
	System.out.println(fj);
js5cn81o

js5cn81o1#

原因是从1.2.57开始,JavaBeanDeserializer类中的createInstance()方法逻辑发生了变化,从这个版本之后,当属性值不为null时,会直接使用field.set()的方式为属性设置值。而不是像1.2.57之前,使用method.invoke()的方式调用set方法为属性设置值。
个人猜测与1.2.57版本说明中的

有关。
如果想走set方法里的逻辑可以使用JSON.parseObject()方法

ygya80vv

ygya80vv2#

同样遇到了这个困扰,使用 JSON,parseObject 的确是会执行,但是当Json字符串复杂的时候,需要先转JSONObject,再根据Key转Bean就不行了,影响了我司很多应用系统的代码。

c9x0cxw0

c9x0cxw03#

@wenshao 烦请看一下,我司也有和 @WindyDovs 类似的使用场景,获取到数据之后都已经转了 JSONObject,还要再 toJSONString 再用 parseObject 才能正常调用类里某些字段的 @JSONFiled 里的一些配置,这样也太兜圈了

相关问题