jackson 註腳學習參考

(1)初級
咱們從幾個簡單的使用場景開始:重命名屬性,忽略屬性,以及修改屬性所使用的類型。
注意:下面的例子僅僅顯示了成員屬性(field properties),註解一樣也能夠用在成員方法(getter/setter)上。
①屬性重命名時使用的註解
最多見的使用方式之一就是改變某個成員屬性所使用的JSON名稱,例如:

public class Name {
  @JsonProperty("firstName")
  public String _first_name;
}

將會生成以下所示的JSON數據結果:
{ "firstName" : "Bob" }

而不是:
{ "_first_name" : "Bob"}

②忽略屬性時使用的註解
有時POJO包括了一些你不但願輸出的屬性,在這種狀況下,你能夠進行以下操做:
public class Value {
  public int value;
  @JsonIgnore public int internalValue;
}

這時獲得的JSON數據結果以下:
{ "value" : 42 }

或者,你可能忽略掉某些從JSON數據中獲得的屬性,若是是這樣,你可使用:
@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
  public int value;
}

這樣就可以處理像以下所示的JSON數據:
{ "value" : 42, "extra" : "fluffy", "uselessValue" : -13 }

最後,你甚至能簡單地忽略掉從JSON(因爲在應用中沒有徹底匹配的POJO)中得到的全部「多餘的」屬性。你能夠經過添加以下代碼完成這個操做:
@JsonIgnoreProperties(ignoreUnknown=true)
public class PojoWithAny {
  public int value;
}

③選擇更多/更少(more/less)指定類型(specific types)時使用的註解
在有些狀況下,Jackson在讀入或輸出一個成員屬性時,所選用的類型(type)可能並非你想要的:
•當讀取(反序列化)時,聲明的類型(declared type)多是一個基本類型(general type),可是你確切地知道應該使用的實現類型(譯註:也就說,咱們須要反序列化後生成的對象是實現類型的);
•當輸出(序列化)時,Jackson默認使用的是給定的運行時類型(the specific runtime type);可是你可能不想輸出那個類型的全部信息,而僅僅是它的父類型所囊括的信息。
在這些應用場景,你可使用以下的註解進行處理:
public class ValueContainer {
  // 雖然代碼中使用的類型(type)是'Value', 但咱們但願讀取到的JSON 以後獲得的對象的類型是'ValueImpl'
  @JsonDeserialize(as=ValueImpl.class)
  public Value value;

  // 雖然運行時的類型(type)多是'AdvancedType'(高級類型), 可是咱們確實想序列化
  // 成爲'BasicType'(基礎類型); 有兩種處理方式:
  @JsonSerialize(as=BasicType.class)
  // 或者咱們能夠這樣: @JsonSerialize(typing=Typing.STATIC)
  public BasicType another;
}

(2)中級
①使用構造器或工廠方法
在默認狀況下,當由JSON數據建立相應類的實例時,Jackson嘗試使用該類的「默認」構造器(即無參數構造器)。不過,你能夠選擇使用其餘的構造器,或者一個靜態工廠方法,來建立實例。完成這個操做,你須要使用@JsonCreator註解,有可能還須要使用@JsonProperty註解給參數(arguments)綁定名稱。
public class CtorPOJO {
   private final int _x, _y;

   @JsonCreator
   public CtorPOJO(@JsonProperty("x") int x, @JsonProperty("y") int y) {
      _x = x;
      _y = y;
   }
}

使用相同的方式,能夠將@JsonCreator用在靜態工廠方法上。不過,還有一個可選的替代方案,被稱做「受權式」構建器(「delegating」 creator):

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");
   }
}

不一樣之處在於,構建器方法只能有一個參數,並且參數必定不要(must NOT)添加@JsonProperty註解。

②處理多態類型(polymorphic types)
若是你要進行讀取、輸出操做的對象擁有許多可能的子類型(即表現出多態性),你可能還須要添加一些類型信息。Jackson在反序列化時(讀取JSON數據,生成相應的對象)須要這些信息,以便能正確地讀取對象的類型。咱們能夠經過在「基本類型」上添加@JsonTypeInfo註解來完成操做:
//將Java類的名稱(「com.myempl.ImplClass」)存儲到JSON的一個名稱爲「class」的屬性中
@JsonTypeInfo(use=Id.CLASS, include=As.PROPERTY,property=」class」)
public abstract class BaseClass {
}

public class Impl1 extends BaseClass {
public int x;
}

public class Impl2 extends BaseClass {
public String name;
}

public class PojoWithTypedObjects {
public List<BaseClass> items;
}

這樣,序列化以後的JSON格式以下:
{「items」 : [
{「class」:」Impl2」,  「name」: 「Bob」},
{「class」:」Impl1」, :」x」 : 13}
]}

注意:這個註解還有不少配置能夠進行設置,詳細內容請查閱瀏覽:
• Javadocs
• 多態類型處理簡介I(ntro to polymorphic type handling)


③從新設置屬性的自動發現(Changing property auto-detection)
Jackson默認的屬性發現規則將會查找到以下所述的屬性:
•全部被public修飾的字段(成員變量);
•全部被public修飾的getter(即形如「getXxx()」的方法);
•全部被public修飾的setter(即形如「setXxx(value)」的方法),無論可見或不可見。
不過若是這樣也不行,你能夠經過使用使用註解@JsonAutoDetect來改變可見級別。若是你想自動發現全部的字段(就像GSON包所進行的操做那樣),你能夠這樣作:
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
public class POJOWithFields {
private int value;
}
或者,你想禁用對全部字段的自動發現:
@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
public class POJOWithNoFields {
//不會被序列化,除非再有一個能夠訪問的「getValue」方法
public int value;
}less

相關文章
相關標籤/搜索