Jackson循环引用注解

@JsonManagedReference和@JsonBackReference联合使用
@JsonManagedReference作用于目标POJO的属性上
@JsonBackReference目标POJO反向引用的属性上

参考

属性别名

@JsonProperty, @JsonSetter, @JsonGetter, @JsonAlias

@JsonProperty
可以用于属性和getter/setter方法上,用于重命名属性名,包括序列化和反序列化时。另外可以指定一个access属性:
READ_ONLY:只在反序列化时有这个属性
WRITE_ONLY:只在序列化时有这个属性
READ_WRITE:序列化和反序列化时都有

@JsonSetter/@JsonGetter:

@JsonSetter只能用于setter方法,@JsonGetter只能用户getter方法,只用二者中的一个标签时,与@JsonProperty作用一模一样。

但是为什么还要单独介绍这俩属性?考虑这样一种case,对于一个java的pojo类的一个属性,我们希望序列化时是一个属性名,反序列化时是另一个属性名

@JsonAlias:
反序列化可指定多个别名

构造函数注解

@JsonCreator

可用于将构造函数和工厂方法定义为用于实例化关联类的新实例的标记注释。
默认情况下,Jackson的反序列化,默认选择类的无参构造函数创建类对象并使用setter方法给属性赋值,当没有无参构造函数时会报错。除此之外,我们还可以使用@JsonCreator注解自定义反序列化的过程,在我们自定义的反序列化函数里面,我们有更强的灵活性,可以完成更多的非规定动作。使用@JsonCreator注解的参数前面需要加上@JsonProperty,否则会报错。一共有两种自定义反序列化渠道:

  • @JsonCreator注解加在构造方法上
  • @JsonCreator注解加在工厂静态方法上

例:

1
2
3
4
5
@JsonCreator
public HelloEvent(@JsonProperty("source") Object source) {
super(source);
serializableSource = source;
}

@ConstructorProperties

@ConstructorProperties注解的作用和@JsonCreator注解起到的作用是一致的,但是它只能加在构造方法上,作为反序列化函数。但是它的语法更简洁,使用起来也更加方便,不用@JsonProperty注解。又提供了灵活性,我们可以在构造方法反序列化过程中,针对该对象做更多的非规定操作。

1
2
3
4
5
6
@ConstructorProperties({"source", "hospitalId", "data",})
public HelloEvent(String source, Long hospitalId, String data) {
super(source);
this.hospitalId = hospitalId;
this.data = data;
}

单字段序列化

@JsonValue
可以用在get方法或者属性字段上,一个类只能用一个,当加上@JsonValue注解时,序列化时只返回这一个字段的值,而不是这个类的属性键值对。

1
2
3
4
5
6
7
8
9
public class Teacher {

@JsonValue
String name;

int age;
String address;

}

输出结果 "teacher name"