The visibility of the fields

本篇文章在說明:

  • 預設的輸出欄位顯示規則
  • 如何使用@JsonAutoDetect去改變欄位顯示規則
  • Global顯示規則之設定

在沒有特別設定的情況下,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}

@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也類似,只是針對項目不同而已。

如果visibility的規則一致,且不想在各類別上設定,則可以透過調整ObjectMapper的VisibilityChecker達到目的:

		VisibilityChecker<?> checker = mapper.getVisibilityChecker().
				withGetterVisibility(Visibility.NONE).
				withIsGetterVisibility(Visibility.NONE);
		mapper.setVisibility(checker);

如果有特別需求的部分,只要再使用@JsonAutoDetect就可以覆蓋了。

一般情況下是不太需要使用到@JsonAutoDetect或VisibilityChecker。除非每個要顯示的欄位都已透過@JsonProperty定義,且名稱可能與Get Method不同,這時候你就會需要將getterVisibility與isGetterVisibility設為NONE;當然你也可以用@JsonIgnore將Get Method濾掉。至於要用哪種,就視你喜好而定了。