1. 程式人生 > >Jackson常用註解介紹

Jackson常用註解介紹

1 排除屬性
@JsonIgnore,一般標記在屬性或方法上;作用於序列化與反序列化;

@JsonIgnoreProperties,如果是代理類,由於無法標記在屬性或方法上,所以,可以標記在類宣告上;也作用於反序列化時的欄位解析;

有時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;
}


2 屬性別名(屬性重新命名時使用的註解)

@JsonProperty,序列化/反序列化都有效;

最常見的使用方式之一就是改變某個成員屬性所使用的JSON名稱,例如:

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

將會生成如下所示的JSON資料結果:
{ "firstName" : "Bob" }

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


3 屬性排序
@JsonPropertyOrder,註釋在類宣告中;

4 屬性格式轉換
使用自定義序列化/反序列化來處理;
@JsonSerialize,序列化;
@JsonDeserialize,反序列化;

注意:在使用hibernate的時候,查詢資料庫後產生的實體類是個代理類,這時候轉換JSON會報錯;
解決方法有兩種:
1)設定FAIL_ON_EMPTY_BEANS屬性,告訴Jackson空物件不要拋異常;
mapper.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);
2)使用@JsonIgnoreProperties註解
在實體類宣告處加上@JsonIgnoreProperties(value = {"hibernateLazyInitializer", "handler"})註解;
建議使用@JsonIgnoreProperties註解,這樣生成的JSON中不會產生多餘的欄位;

5 父/子關聯
@JsonManagedReference,放在父親類中;
@JsonBackReference,放在孩子類中;


6 去掉包裝
@JsonUnwrapped,意思如下:

Ability to map JSON like
{
"name" : "home",
"latitude" : 127,
"longitude" : 345
}
to classes defined as:
class Place {
public String name;

@JsonUnwrapped
public Location location;
}

class Location {
public int latitude, longitude;
}