jackson 学习之六:常用类注解,java 编程思想第五版电子书
开启 root 对象特性的代码以及序列化结果如下图,可见 JsonRootName 注解的 value 值 aaabbbccc 成了 root 对象的 key:
开启 root 对象的反序列化特性后,用上述红框 3 中的 json 字符串可反序列化成 Test 类的实例;
关于 root 对象的序列化和反序列化特性,可以参考jackson学习之四:WRAP_ROOT_VALUE(root对象);
JsonIgnoreProperties
该注解用于指定序列化和反序列化时要忽略的字段,如下所示,Test 类的 field1 和 field2 被设置为不参与序列化和反序列化操作:
@JsonIgnoreProperties({"field1", "field2"})
static class Test {
private String field0;
private String field1;
private String field2;
// 省去 get、set、toString 方法
演示代码是 JsonIgnorePropertiesSeriallization.java,执行结果如下图:
保持 Test.java 的 JsonIgnoreProperties 注解不变,再试试反序列化,对应的代码在 JsonIgnorePropertiesDeserializer.java,如下图,反序列化后 field1 和 field2 依然是 null,也就是说反序列化操作中,field1 和 field2 都被忽略了:
JsonIgnoreType
被该注解修饰的类,作为其他类的成员变量时,不论是序列化还是反序列化都被忽略了;
来验证一下,如下所示,TestChild 类被 JsonIgnoreType 注解修饰:
@JsonIgnoreType
static class TestChild {
private int value;
// 省去 get、set、toString 方法
如下所示,再把 TestChild 作为 Test 类的成员变量:
static class Test {
private String field0;
private TestChild field1;
// 省去 get、set、toString 方法
序列化操作的代码是 JsonIgnoreTypeSerialization.java,执行结果如下图,可见类型为 TestChild 的 field1 字段,在序列化的时候被忽略了:
再来试试反序列化,代码在 JsonIgnoreTypeDeserializer.java,如下图,可见带有注解 JsonIgnoreType 的类作为成员变量,在反序列化时会被忽略:
JsonAutoDetect
序列化和反序列化时自动识别的范围,如下:
@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.PUBLIC_ONLY)
public class College {
private String name;
private String city;
protected int age = 100;
fieldVisibility 属性有以下值可选:
ANY // 所有
NON_PRIVATE // private 之外的
PROTECTED_AND_PUBLIC // protected 和 public 的(此时 privte 和默认的 package access 时不能被自动识别的)
PUBLIC_ONLY // public 的
NONE // 禁止自动识别
DEFAULT // 默认的,用于继承父类的自动识别的范围
验证,如下图,College 类设置了注解,fieldVisibility 是 PUBLIC_ONLY,红框中显示 age 字段是 protected 类型的:
序列化结果如下图红框,age 字段不是 public,所以没有输出:
fieldVisibility 改成 NON_PRIVATE 再试试:
如下图红框,age 不是 private,所以可以被序列化:
JsonPropertyOrder
这个注解好理解,就是指定序列化的顺序,注意该注解仅在序列化场景有效;
先看看没有 JsonPropertyOrder 注解时的序列化顺序,Test.java 如下所示,是和代码的顺序一致的:
static class Test {
private String field0;
private String field1;
private String field2;
// 省去 get、set、toString 方法
此时对 Test 的实例做序列化操作,结果如下图,顺序和代码顺序一致:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200914220500312.png?x-oss-process=image/watermark,type_ZmFuZ3po
ZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2JvbGluZ19jYXZhbHJ5,size_16,color_FFFFFF,t_70#pic_center)
现在给 Test 类加上 JsonPropertyOrder 注解,顺序是 field2、field0、field1:
@JsonPropertyOrder({"field2", "field0", "field1"})
static class Test {
评论