记录一次使用fastjson把json字符串转为对象时属性缺失问题

记录一次使用fastjson把json字符串转为对象时属性缺失问题


    在一次使用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:增加无参构造器

四、源码追踪

暂略。。。。。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值