Jackson Annotation學習筆記

Jackson中的註解:

命名類註解

1.@JsonProperty:表明java類綁定json中的屬性名。調用格式可以無參數表示與類中屬性同名,同樣可以用@JsonProperty ("name"),重新定義json中此屬性的名字。

包含類註解

    案例:

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

    結果,

{ "firstName" : "Bob" }

2.@JsonAutoDetect:類註解,用於類定義屬性檢測。

    案例:

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.ANY)
public class POJOWithFields {
  private int value;
}
    案例:

@JsonAutoDetect(fieldVisibility=JsonAutoDetect.Visibility.NONE)
public class POJOWithNoFields {
  // will NOT be included, unless there is access 'getValue()'
  public int value;
}

3.@JsonIgnore:用於忽略指定屬性的簡單註解。

    案例:

public class Value {
  public int value;
  @JsonIgnore public int internalValue;
}
    結果,

{ "value" : 42 }

4.@JsonIgnoreProperties:指定忽略一組屬性或者忽略所有未知屬性。

    案例(序列化過層中忽略列表中的指定屬性):

@JsonIgnoreProperties({"prop1", "prop2"})

  案例:

@JsonIgnoreProperties({ "extra", "uselessValue" })
public class Value {
  public int value;
}
  可處理,

{ "value" : 42, "extra" : "fluffy", "uselessValue" : -13 }

    案例(反序列化過程中忽略所有的未知屬性,即未知屬性沒有set與get方法):

@JsonIgnoreProperties(ignoreUnknown=true)

  案例:

@JsonIgnoreProperties(ignoreUnknown=true)
public class PojoWithAny {
  public int value;
}

5.@JsonIgnoreType:忽略指定類型的所有屬性。

6.@JsonInclude:用於序列化中忽略null值或者empty值,可以指定某一個屬性,也可以指定某一個類中所有屬性。

序列化和反序列化細節類註解:

7.@JsonFormat:用於指定一類特定行爲,比如日期轉換格式。

8.@JsonUnwrapped:用與指定序列化過程中值爲展開的,反序列化過程中重新包裹。

9.@JsonView:用於指定屬性需要被序列化或者反序列化。

反序列化類註解

10.@JacksonInject:指定反序列化過程中,屬性值不從json中獲取,而需要注入方式獲得。

11.@JsonAnySetter:用於定義一個兩個參數的方法,實現未綁定屬性的反序列化,保證這些未綁定屬性反序列化之後擁有set和get方法。

12.@JsonCreator:用於定義實現反序列化的實體初始化。

13.@JsonSetter:用於代替@JsonProperty,來指定屬性的set方法。

序列化類註解

11.@JsonAnyGetter:用於定義一個get方法,返回java.util.Map類型。java類中屬性將被序列化爲json對象的屬性。

12.@JsonGetter:用於代替@JsonProperty,指定屬性的get方法。

13.@JsonPropertyOrder:指定屬性的序列化順序。

14.@JsonRawValue:用於指定序列化過程中獲取不帶任何裝飾和格式規範的json。

15.@JsonValue:指定類屬性以string類型進行序列化,相當於java的tostring方法。

16.@JsonRootName:如果json根包裹可用,指定最外層包裹名。

類型處理類註解

17.@JsonSubTypes:處理多態時,指定生成子類反序列化過程中註解類型。

18.@JsonTypeId:類標記用於指定屬性來標記java類,而不是通過類名或者其他來標記。

19.@JsonTypeInfo:用來指定何種類型的屬性值被序列化,如何序列化。

    案例:

// Include Java class name ("com.myempl.ImplClass") as JSON property "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;
}
    生成,

{ "items" : [
  { "class":"Impl2", "name":"Bob" },
  { "class":"Impl1", "x":13 }
]}

20.@JsonTypeName:類標記指定邏輯類型名稱,如果定義了@JsonTypeInfo,還可以作爲java類標記。

對象引用和定義類註解

21.@JsonManagedReference, @JsonBackReference:標記父子匹配關聯關係。

22.@JsonIdentityInfo:用於指示對象標識是序列化/反序列化的值,以使得多個引用的單個Java對象可以適當地反序列化時使用。這可以用來妥善處理循環對象圖和有向無環圖。

元註解

23.@JacksonAnnotation:添加所有註解。

24.@JacksonAnnotationsInside:表示將註解捆綁,然後定義一個捆綁後的註解。

25.@JsonDeserialize

26.@JsonSerialize

    案例:

public class ValueContainer {
  // although nominal type is 'Value', we want to read JSON as 'ValueImpl'
  @JsonDeserialize(as=ValueImpl.class)
  public Value value;

  // although runtime type may be 'AdvancedType', we really want to serialize
  // as 'BasicType'; two ways to do this:
  @JsonSerialize(as=BasicType.class)
  // or could also use: @JsonSerialize(typing=Typing.STATIC)
  public BasicType another;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章