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

2024-08-28 44 views
5

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);

回答

2

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

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

2

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

3

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