https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,涉及Java、Docker、Kubernetes、DevOPS等;
本文是《jackson学习》系列的第四篇,前面学习了常用API,可以执行最基本的序列化和反序列化操作,接下来要学习的就是jackson强大的注解能力,本篇要学的是root对象特性,主要内容如下:
{
"id" : 1,
"name" : "book"
}
{
"aaabbbccc" : {
"id" : 2,
"name" : "food"
}
}
root对象特性提前做个小结,这样如果您时间有限,仅看这一节即可:
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
{
"id" : 1,
"name" : "book"
}
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
{
"id" : 1,
"name" : "book"
}
用对比的方式可以更清楚了解JsonRootName的作用,接下来的学习咱们准备两个POJO类,一个没有JsonRootName注解,另一个有JsonRootName注解:
public class Order1 {
private int id;
private String name;
// 省去get、set、toString方法
...
}
import com.fasterxml.jackson.annotation.JsonRootName;
@JsonRootName(value = "aaabbbccc")
public class Order2 {
private int id;
private String name;
// 省去get、set、toString方法
...
}
mapper.enable(SerializationFeature.WRAP_ROOT_VALUE);
public static void main(String[] args) throws Exception {
// 实例化Order1和Order2
Order1 order1 = new Order1();
order1. setId(1);
order1.setName("book");
Order2 order2 = new Order2();
order2. setId(2);
order2.setName("food");
// 没有开启WRAP_ROOT_VALUE的时候
logger.info("没有开启WRAP_ROOT_VALUE\n");
ObjectMapper mapper1 = new ObjectMapper();
// 美化输出
mapper1.enable(SerializationFeature.INDENT_OUTPUT);
logger.info("没有JsonRootName注解类,序列化结果:\n\n{}\n\n", mapper1.writeValueAsString(order1));
logger.info("有JsonRootName注解的类,序列化结果:\n\n{}\n\n\n\n", mapper1.writeValueAsString(order2));
// 开启了WRAP_ROOT_VALUE的时候
logger.info("开启了WRAP_ROOT_VALUE\n");
ObjectMapper mapper2 = new ObjectMapper();
// 美化输出
mapper2.enable(SerializationFeature.INDENT_OUTPUT);
// 序列化的时候支持JsonRootName注解
mapper2.enable(SerializationFeature.WRAP_ROOT_VALUE);
logger.info("没有JsonRootName注解类,序列化结果:\n\n{}\n\n", mapper2.writeValueAsString(order1));
logger.info("有JsonRootName注解的类,序列化结果:\n\n{}", mapper2.writeValueAsString(order2));
}
{
"id" : 2,
"name" : "food"
}
{
"aaabbbccc" : {
"id" : 2,
"name" : "food"
}
}
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);