在一次使用fastJson把json字符串转为对象时,发现有个属性缺失,经多方百度才得问题原因,现将问题原因及解决步骤记录如下:
一、问题现象
问题复现步骤如下
1 使用到的POJO:
public class SysUser {
private String userName;
private String password;
private String job;
private String gender = "Unknown";
public SysUser(String userName, String password, String job) {
this.userName = userName;
this.password = password;
this.job = job;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getJob() {
return job;
}
public void setJob(String job) {
this.job = job;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
@Override
public String toString() {
return "SysUser{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
", job='" + job + '\'' +
", gender='" + gender + '\'' +
'}';
}
}
2 复现步骤
public static void main(String[] args) {
SysUser sysUser = new SysUser("大王", "大王", "王者");
sysUser.setGender("男");
String jsonString = JSON.toJSONString(sysUser);
SysUser userObject = JSON.parseObject(jsonString, SysUser.class);
System.out.println(userObject);
}
debug查看上述代码的执行结果如下图,由执行结果可看到,我给sysUser变量的字段gender赋值了"男",由sysUser转换成的jsonString中的字段gender值也是男,但是使用
JSON.parseObject(jsonString, SysUser.class);
把字符串转为SysUser对象时,gender属性仍然为默认值“Unknown”,也就是说并没有把sonString中的字段值赋予SysUser对象的gender变量:
二、问题原因
此问题困惑了我挺久,网查此问题大部分都是缺少字段的set方法或者属性名有问题导致的。由于根本原因的查找未涉及源码追究,暂不表。
直接说结论,结论就是,此pojo有四个属性,但是唯一的一个构造方法只包括了其中三个属性,导致另外一个属性在进行字符串转对象时,无法赋值(我一直以为只要有字段属性的get和set方法,fastJson转换时就会把值赋予给相应字段,原来并不是如此)。
三、解决办法
解决方法很简单,可用如下两个方式:
1:增加全参数构造器
2:增加无参构造器
四、源码追踪
暂略。。。。。