Introduction
我們要轉換為json的物件,有些成員變數並非是最後要呈現的。此時我們可以製作針對顯示的物件,僅宣告要顯示的欄位為成員變數,也可以透過@JsonIgnore或@JsonIgnoreProperties來達到預期結果。
How to?
Source Object
public class Student { @JsonProperty(value="id") private String mID; @JsonProperty(value="passwd") private String mPasswd; @JsonProperty(value="email") private String mEmail; public Student() { } public String getEmail() { return mEmail; } public void setEmail(String aEmail) { this.mEmail = aEmail; } public String getID() { return mID; } public void setID(String aID) { this.mID = aID; } public String getPasswd() { return mPasswd; } public void setPasswd(String aPasswd) { this.mPasswd = aPasswd; } }
@JsonIgnore
假如我們要Ignore的變數為mEmail,可以在get函式與變數宣告上使用@JsonIgnore:
@JsonProperty(value="email") @JsonIgnore private String mEmail; @JsonIgnore public String getEmail() { return mEmail; }
假如你沒使用@JsonProperty,可以在get函式宣告即可:(Jackson會把get method與使用@JsonProperty當成兩個個體)
private String mEmail; @JsonIgnore public String getEmail() { return mEmail; }
簡單起見,建議還是兩邊都宣告為佳。
@JsonIgnoreProperties
如果使用@JsonIgnoreProperties去忽略範例中的mEmail,只要在類別宣告上指定email欄位即可:
@JsonIgnoreProperties({"email"}) public class Student { // ... }
但如果@JsonProperty所宣告的名稱與get函式不同,@JsonIgnoreProperties必須包含兩者:
@JsonIgnoreProperties({"email","mail"}) public class Student { @JsonProperty(value="mail") private String mEmail; public String getEmail() { return mEmail; } }
假如你要針對類別中某個成員內的欄位做忽略,以Map為例:
@JsonProperty(value="metadata") @JsonIgnoreProperties({"test1","test2"}) private Map<String, Object> mMetadata; public Student() { mMetadata = new HashMap<String, Object>(); Map<String, Object> tmp = new HashMap<String, Object>(); tmp.put("test1", "789"); tmp.put("test2", "111"); tmp.put("test3", "222"); mMetadata.put("test1", "123"); mMetadata.put("test2", "456"); mMetadata.put("test3", tmp); }
所宣告的物件,也會忽略包含value中的欄位:
{"passwd":"123456","id":"user","metadata":{"test3":{"test3":"222"}}}
Summary
本篇介紹的@JsonIgnore與@JsonIgnoreProperties,可以讓產生的內容不包含你所宣告的欄位。總結以上:
- @JsonIgnore宣告於要Ignore的欄位上。
- @JsonIgnoreProperties宣告於類別上,指定要Ignore之項目;如果宣告於成員或get函式,則是針對內容類別的欄位做忽略。
- 兩者在Serialize時,就會被忽略。如果想要選擇性的顯示,必須透過Filter的方式。
留言
張貼留言