json之jackson序列化反序列化探究(二)

上一篇(json之jackson的介绍以及基本使用ObjectMapper): https://www.jianshu.com/p/6d6911fa999e

关于jackson序列化的几个问题/现象

1.在默认情况下,ObjectMapper在序列化时,将所有的字段一一序列化,无论这些字段是否有值,或者为null

例如:

/**
 * 测试用户
 */
@ToString
@Accessors(chain = true)
public class TestUser {
    @Setter
    @Getter
    private Integer id;
    @Setter
    @Getter
    private String name;
    @Setter
    @Getter
    private Integer age;
    @Setter
    @Getter
    private Date createTime;
}

测试

// 测试对象构造
TestUser testUser01 = new TestUser().setId(1).setAge(11).setName("用户一").setCreateTime(new Date());
// 序列化结果
{"id":1,"name":"用户一","age":11,"createTime":1634536879590}

2.序列化依赖于getter方法,如果某个字段没有getter方法,那么该字段是不会被序列化的

例如:我们去除测试用户部分字段的getter方法

/**
 * 测试用户
 */
@ToString
@Accessors(chain = true)
public class TestUser {
    @Setter
    // @Getter
    private Integer id;
    @Setter
    // @Getter
    private String name;
    @Setter
    @Getter
    private Integer age;
    @Setter
    @Getter
    private Date createTime;
}

测试

// 测试对象构造
TestUser testUser01 = new TestUser().setId(1).setAge(11).setName("用户一").setCreateTime(new Date());
// 序列化结果
{"age":11,"createTime":1634537124114}

由测试可见字段id name,并没有被序列化
可知ObjectMapper并不真正地检查getter对应的属性是否存在于User对象上,而是通过getter的命名规约进行调用

3.jackson的反序列化中如果json中有java对象中不存在的字段(实则是识别有没有setter方法)会报异常

例如:我们构造一个不存的属性temp, 只有getter方法

/**
 * 测试用户
 */
@ToString
@Accessors(chain = true)
public class TestUser {
    @Setter
    @Getter
    private Integer id;
    @Setter
    @Getter
    private String name;
    @Setter
    @Getter
    private Integer age;
    @Setter
    @Getter
    private Date createTime;

    public String getTemp() {
        return "temp";
    }
}

测试

TestUser testUser01 = new TestUser().setId(1).setAge(11).setName("用户一").setCreateTime(new Date());
// 序列化结果 temp也被序列化出来
{"id":1,"name":"用户一","age":11,"createTime":1634537922616,"temp":"temp"}
// 反序列化 直接报异常 UnrecognizedPropertyException
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "temp" (class com.bj.json.bean.jackson.TestUser)

给java对象不存在的属性添加一个setter方法

public void setTemp(String temp){
}

反序列化成功

总结

综上,在默认情况下(即不对ObjectMapper做任何额外配置,也不对Java对象加任何Annotation),ObjectMapper依赖于Java对象的默认的无参构造函数进行反序列化,并且严格地通过getter和setter的命名规约进行序列化和反序列化

© 版权声明

相关文章

暂无评论

none
暂无评论...