遇到一個奇葩場景,維護一個老的程序, 應用換了個服務方. 要切接口. 但有如下問題.前端
接口邏輯改動還好 , 但這個轉字段和類型 ,真的是頭大啊.....編程
FastJson均可以解決.json
SerializeFilter是經過編程擴展的方式定製序列化。fastjson支持6種SerializeFilter,用於不一樣場景的定製序列化。數組
PropertyPreFilter 根據PropertyName判斷是否序列化 PropertyFilter 根據PropertyName和PropertyValue來判斷是否序列化 NameFilter 修改Key,若是須要修改Key,process返回值則可 ValueFilter 修改Value BeforeFilter 序列化時在最前添加內容 AfterFilter 序列化時在最後添加內容
public interface PropertyFilter extends SerializeFilter { boolean apply(Object object, String propertyName, Object propertyValue); }
能夠經過擴展實現根據object或者屬性名稱或者屬性值進行判斷是否須要序列化。例如:app
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
和PropertyFilter不一樣只根據object和name進行判斷,在調用getter以前,這樣避免了getter調用可能存在的異常。code
public interface PropertyPreFilter extends SerializeFilter { boolean apply(JSONSerializer serializer, Object object, String name); }
若是須要修改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());
public interface ValueFilter extends SerializeFilter { Object process(Object object, String propertyName, Object propertyValue); }
在序列化對象的全部屬性以前執行某些操做,例如調用 writeKeyValue 添加內容文檔
public abstract class BeforeFilter implements SerializeFilter { protected final void writeKeyValue(String key, Object value) { ... } // 須要實現的抽象方法,在實現中調用writeKeyValue添加內容 public abstract void writeBefore(Object object); }
在序列化對象的全部屬性以後執行某些操做,例如調用 writeKeyValue 添加內容get
public abstract class AfterFilter implements SerializeFilter { protected final void writeKeyValue(String key, Object value) { ... } // 須要實現的抽象方法,在實現中調用writeKeyValue添加內容 public abstract void writeAfter(Object object); }
PropertyPreFilter --> PropertyFilter --> NameFilter --> ValueFilter --> BeforeFilter --> AfterFilter
以數組定義的順序執行