上一篇(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的命名规约进行序列化和反序列化
© 版权声明
文章版权归作者所有,未经允许请勿转载。
相关文章
暂无评论...





