Jackson Annotations 基本用法

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注解大全

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值