Introduction
本篇文章在說明:
- 預設的輸出欄位顯示規則
- 如何使用@JsonAutoDetect去改變欄位顯示規則
- Global顯示規則之設定
Default Visibility
在沒有特別設定的情況下,Jackson的Serializer是根據Get Method與Class的public data member決定欄位名稱。
public data member:
public String mName = "test";
Output:
{"mName":"test"}
get method,boolean回傳值被稱為is-getter:
public String getName(){ return "test"; } public boolean isValid(){ return false; }
Output:
{"name":"test","valid":false}
Use @JsonAutoDetect
@JsonAutoDetect提供五種項目設定,其中creatorVisibility與setterVisibility的實際用途還不曉得,之後再研究:
- fieldVisibility: 針對data member。
- getterVisibility: 針對getXXX()。
- isGetterVisibility: 針對type為boolean的isXXX()。
預設情況下,成員變數必須宣告為public才會出現在結果。假如使用了fieldVisibility=Visibility.ANY,則會將private成員變數也輸出:
@JsonAutoDetect(fieldVisibility=Visibility.ANY) public static class AutoDetectObject { private String mName ; public AutoDetectObject(){ } private void setName(String aName){ mName = aName; } public String getName(){ return mName; } }
Output:
{"mName":"test","name":"test"}
而getterVisibility與isGetterVisibility也類似,只是針對項目不同而已。
Global visibility
如果visibility的規則一致,且不想在各類別上設定,則可以透過調整ObjectMapper的VisibilityChecker達到目的:
VisibilityChecker<?> checker = mapper.getVisibilityChecker(). withGetterVisibility(Visibility.NONE). withIsGetterVisibility(Visibility.NONE); mapper.setVisibility(checker);
如果有特別需求的部分,只要再使用@JsonAutoDetect就可以覆蓋了。
Summary
一般情況下是不太需要使用到@JsonAutoDetect或VisibilityChecker。除非每個要顯示的欄位都已透過@JsonProperty定義,且名稱可能與Get Method不同,這時候你就會需要將getterVisibility與isGetterVisibility設為NONE;當然你也可以用@JsonIgnore將Get Method濾掉。至於要用哪種,就視你喜好而定了。
留言
張貼留言