fastjson2 icon indicating copy to clipboard operation
fastjson2 copied to clipboard

[BUG] 序列化时会调用对象的所有get方法,并且是根据get方法去解析属性的吗

Open wpfxff opened this issue 1 year ago • 1 comments

问题描述

fastjson 序列化时,会调用所有get开头的方法,并且是根据get方法去解析对象属性的吗?(是设计如此吗) User对象没有创建test属性,但是输出结果根据getTest方法解析到了test属性

环境信息

请填写以下信息:

  • OS信息: window10
  • JDK信息: 1.8
  • 版本信息:所有版本(fastjson fastjson2)

重现步骤

public static void main(String[] args) { User user = new User(); user.setName("test"); System.out.println(JSON.toJSONString(user)); } class User{ private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getTest(){
    System.out.println("测试调用自定义get方法");
    return "测试调用自定义get方法";
}

public String getdev(){
    System.out.println("测试");
    return "测试";
}

}

输出结果

测试 测试调用自定义get方法 {"dev":"测试","name":"test","test":"测试调用自定义get方法"}

期待的正确结果

期望只输出对应字段的序列化结果,目前测试了市面上的几款json工具,好像只有fastjson、fastjson2会出现此问题

wpfxff avatar Jul 29 '24 09:07 wpfxff

@wpfxff 你可以使用 @Transient 或者 @JSONField(serialize = false) 注解修饰getXXXX()方法来解决这个问题。

@Transient 
public String getTest(){
    System.out.println("测试调用自定义get方法");
    return "测试调用自定义get方法";
}
@JSONField(serialize = false)
public String getTest(){
    System.out.println("测试调用自定义get方法");
    return "测试调用自定义get方法";
}

MoshiCoCo avatar Aug 10 '24 02:08 MoshiCoCo