遇到一个奇葩场景,维护一个老的程序, 应用换了个服务方. 要切接口. 但有如下问题.前端
接口逻辑改动还好 , 但这个转字段和类型 ,真的是头大啊.....编程
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
以数组定义的顺序执行