序列化与反序列化
序列化是将对象的状态信息转换为可以存储或传输的形式的过程。反之则为反序列化。
例如:在Java中,后台返回数据给前端,一般都将其转成 Json对象,这个把java对象转成 Json 对象的过程就是序列化。
妙用com.fasterxml.jackson.annotation.*系列注解
巧妙地利用com.fasterxml.jackson.annotation.*
系列的注解可以在前后端交互数据时候,起到灵活转换的功效。
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
@JsonProperty
用在一般属性上
@JsonProperty
用在属性上时,在序列化的时候,会将属性名称序列化成指定的名称。
【示例】
有一个 Test 对象,含有两个Field,分别为fieldOne
、fileTwo
。
@Data
public class Test{
private String fieldOne = "xxx";
private String fileTwo = "yyy";
}
正常序列化:字段名相同
{"fieldOne":"xxx" , "fileTwo":"yyy"}
现在加上@JsonProperty
注解
@Data
public class Test{
@JsonProperty(value = "fieldThree") // 只有 value 属性可以省略 ("fieldThree")
private String fieldOne;
private String fileTwo;
}
序列化:这个时候可以看到序列化后fieldOne
变成了fieldThree
{"fieldThree":"xxx" , "fileTwo":"yyy"}
常用属性:
value
:表示字段名称access
:设置该字段的访问控制权限
JsonProperty.Access.WRITE_ONLY
:表示这个字段只能被反序列化,序列化时会被限制访问JsonProperty.Access.READ_ONLY
:表示这个字段只能被序列化,反序列化时会限制访问
用在集合属性上
@JsonProperty
用在集合属性上时,在序列化的时候,会copy一份集合以指定名称名称,也就是说序列化后会存在两个集合,一个原名的,一个指定命名的。两个集合除了名字不同其余都一样。
@JsonAlias
@JsonAlias
用来指定字段的别名,在反序列化的时候,会轮流把指定的一个别名或多个别名的属性的值赋给这个字段,这个过程是重复赋值的过程。
【示例】
@Data
public class Test{
private String fieldOne;
private String fileTwo;
}
Json对象:
{"fieldThree":"xxx" , "fileTwo":"yyy"}
因为Json对象没有fieldOne
字段,所以反序列化时,是匹配不到java对象的fieldOne
字段的。
若加上@JsonAlias("fieldThree")
指定别名
@Data
public class Test{
@JsonAlias("fieldThree")
private String fieldOne;
private String fileTwo;
}
这时候序列化就会把Json对象中的fieldThree
字段匹配到Java对象的fieldOne
字段。
另外,@JsonAlias也可以贴在
Setter
方法上。