Jackson Annotations 基本用法
一、重命名属性
public class Name {
@JsonProperty("firstName")
public String _first_name;
}
结果是:
{ "firstName" : "Bob" }
二、忽略属性
public class Value {
public int value1;
@JsonIgnore
public int value2;
}
结果是:
{ "value1" : 42 }
①当由json字符串反序列化成pojo时,如果想忽略json字符串中的某些属性这样处理:
@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
public int value;
}
这样就可以把下面的json字符串反序列化成 Value 对象:
{ "value" : 42, "extra" : "fluffy", "uselessValue" : -13 }
②若反序列化时要忽略所有pojo中不存在的属性可以这样:
@JsonIgnoreProperties(ignoreUnknown=true)
public class PojoWithAny {
public int value;
}
三、指定属性类型
有时候属性的类型并不是你想要的,比如以下情况:
- 反序列化的时候,声明的类型是一个通用类型,但是你知道应该对应哪个具体的实现类。
- 序列化时,你可能不需要一个类的全部属性,只是想要它的父类的属性。
这样处理就可以了:
public class ValueContainer {
// 尽管这个属性是 Value 类型,
// 但是你想在反序列化时将json字符串读取成ValueImpl 类型
@JsonDeserialize(as=ValueImpl.class)
public Value value;
// 如果你将BasicType的子类AdvancedType的一个对象赋值给这个属性
// 但是你又想按照BasicType类型来序列化
//(默认是按照属性的运行时类型,即AdvancedType序列化)
@JsonSerialize(as=BasicType.class)
// 或者用 @JsonSerialize(typing=Typing.STATIC)
public BasicType another;
}
四、使用构造器或工厂方法
①Jackson默认使用无参的默认构造器来创建实例,但是也可以使用其他构造器或者静态的工厂方法来创建实例。
public class CtorPOJO {
private final int _x, _y;
@JsonCreator
public CtorPOJO(@JsonProperty("x") int x, @JsonProperty("y") int y) {
_x = x;
_y = y;
}
}
②静态的工厂方法也是同样的用法。但是还有一个被称作“委托”的另类用法:
public class DelegatingPOJO {
private final int _x, _y;
@JsonCreator
public DelegatingPOJO(Map<String,Object> delegate) {
_x = (Integer) delegate.get("x");
_y = (Integer) delegate.get("y");
}
}
这种用法只能有一个参数,而且不能带@JsonProperty注解。
五、修改属性自动检测
Jackson默认的属性检测规则是这样的:
- 所有的 public 类型的属性
- 所有的 public 类型的 get 方法
- 所有的 set 方法(无论方法的可见性)
如果默认规则不能满足需求,可以用@JsonAutoDetect注解来改变。
①比如想要自动检测到所有属性(无论该属性的可见性)
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
public class POJOWithFields {
private int value;
}
②想要跳过所有方法
@JsonAutoDetect(getterVisibility=JsonAutoDetect.Visibility.NONE)
public class POJOWithNoMethod {
}
③两个加在一起就是只检测属性不检测方法了(鄙人就是为了这个才去读了官方文档的)
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY, getterVisibility=JsonAutoDetect.Visibility.NONE)
public class POJOWithOnlyField {
}
基本使用就这些了。英文原文看这里:原文地址。Jackson全部注解看这里:Jackson注解大全。