Fastjson - 詳解SerializeFilter,格式化對象字段

遇到一個奇葩場景,維護一個老的程序, 應用換了個服務方. 要切接口. 但有以下問題.

  1. 接口邏輯稍有不同 , 需要自己按原接口文檔,重組邏輯.
  2. 接口字段名,字段類型改動較大. 但還要按原接口文檔返回數據給前端.

接口邏輯改動還好 , 但這個轉字段和類型 ,真的是頭大啊.....

  1. 大小寫: abcDef --> AbcDef , ABC-->abc
  2. 全稱,縮寫: result --> Res , detail --> DE,message --> msg
  3. 字段名稱不同: data --> obj , amount --> money

FastJson都可以解決.

SerializeFilter

SerializeFilter是通過編程擴展的方式定製序列化。fastjson支持6種SerializeFilter,用於不同場景的定製序列化。

PropertyPreFilter 根據PropertyName判斷是否序列化
PropertyFilter 根據PropertyName和PropertyValue來判斷是否序列化
NameFilter 修改Key,如果需要修改Key,process返回值則可
ValueFilter 修改Value
BeforeFilter 序列化時在最前添加內容
AfterFilter 序列化時在最後添加內容

PropertyFilter 根據PropertyName和PropertyValue來判斷是否序列化

  public interface PropertyFilter extends SerializeFilter {
      boolean apply(Object object, String propertyName, Object propertyValue);
  }

可以通過擴展實現根據object或者屬性名稱或者屬性值進行判斷是否需要序列化。例如:

    PropertyFilter filter = new PropertyFilter() {

        public boolean apply(Object source, String name, Object value) {
            if ("id".equals(name)) {
                int id = ((Integer) value).intValue();
                return id >= 100;
            }
            return false;
        }
    };
    
    JSON.toJSONString(obj, filter); // 序列化的時候傳入filter

PropertyPreFilter 根據PropertyName判斷是否序列化

和PropertyFilter不同只根據object和name進行判斷,在調用getter之前,這樣避免了getter調用可能存在的異常。

 public interface PropertyPreFilter extends SerializeFilter {
      boolean apply(JSONSerializer serializer, Object object, String name);
  }

NameFilter 序列化時修改Key

如果需要修改Key,process返回值則可

public interface NameFilter extends SerializeFilter {
    String process(Object object, String propertyName, Object propertyValue);
}

fastjson內置一個PascalNameFilter,用於輸出將首字符大寫的Pascal風格。 例如:

import com.alibaba.fastjson.serializer.PascalNameFilter;

Object obj = ...;
String jsonStr = JSON.toJSONString(obj, new PascalNameFilter());

ValueFilter 序列化時修改Value

  public interface ValueFilter extends SerializeFilter {
      Object process(Object object, String propertyName, Object propertyValue);
  }

BeforeFilter 序列化時在最前添加內容

在序列化對象的所有屬性之前執行某些操作,例如調用 writeKeyValue 添加內容

  public abstract class BeforeFilter implements SerializeFilter {
      protected final void writeKeyValue(String key, Object value) { ... }
      // 需要實現的抽象方法,在實現中調用writeKeyValue添加內容
      public abstract void writeBefore(Object object);
  }

AfterFilter 序列化時在最後添加內容

在序列化對象的所有屬性之後執行某些操作,例如調用 writeKeyValue 添加內容

  public abstract class AfterFilter implements SerializeFilter {
      protected final void writeKeyValue(String key, Object value) { ... }
      // 需要實現的抽象方法,在實現中調用writeKeyValue添加內容
      public abstract void writeAfter(Object object);
  }

多個Filter的執行順序

多種Filter的執行順序

PropertyPreFilter --> PropertyFilter --> NameFilter --> ValueFilter --> BeforeFilter --> AfterFilter

同種Filter的執行順序

以數組定義的順序執行

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