Fastjson - 详解SerializeFilter,格式化对象字段

遇到一个奇葩场景,维护一个老的程序, 应用换了个服务方. 要切接口. 但有如下问题.前端

  1. 接口逻辑稍有不一样 , 须要本身按原接口文档,重组逻辑.
  2. 接口字段名,字段类型改动较大. 但还要按原接口文档返回数据给前端.

接口逻辑改动还好 , 但这个转字段和类型 ,真的是头大啊.....编程

  1. 大小写: abcDef --> AbcDef , ABC-->abc
  2. 全称,缩写: result --> Res , detail --> DE,message --> msg
  3. 字段名称不一样: data --> obj , amount --> money

FastJson均可以解决.json

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或者属性名称或者属性值进行判断是否须要序列化。例如: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

PropertyPreFilter 根据PropertyName判断是否序列化

和PropertyFilter不一样只根据object和name进行判断,在调用getter以前,这样避免了getter调用可能存在的异常。code

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 添加内容get

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的执行顺序

以数组定义的顺序执行

相关文章
相关标签/搜索