博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Fastjson - 详解SerializeFilter,格式化对象字段
阅读量:5981 次
发布时间:2019-06-20

本文共 2742 字,大约阅读时间需要 9 分钟。

hot3.png

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

  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 修改ValueBeforeFilter 序列化时在最前添加内容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的执行顺序

以数组定义的顺序执行

转载于:https://my.oschina.net/ElEGenT/blog/2120230

你可能感兴趣的文章
linux入门学习
查看>>
那些年命途多舛的千千静听,归来能否再现当年荣光?
查看>>
Scrapy框架的使用之Scrapy对接Splash
查看>>
ECMAScript Decorators---装饰器
查看>>
Android组件化专题 - 组件化配置
查看>>
Kotlin 之高阶函数与Lambda表达式与闭包
查看>>
【填坑日记】<transition-group> children must be keyed: <ElTag>
查看>>
Sketch原创插件: Name Organizer
查看>>
小白入门学习Python,值得你重视的那些事儿
查看>>
宜人贷蜂巢API网关技术解密之Netty使用实践
查看>>
【跃迁之路】【730天】程序员高效学习方法论探索系列(实验阶段487-2019.2.20)...
查看>>
SAP云平台对Kubernetes的支持
查看>>
Stream流与Lambda表达式(五) Stream BaseStream AutoCloseable源码解读
查看>>
音乐播放类应用后台播放耗电评测报告
查看>>
leetCode算法-268(缺失数字)
查看>>
Java之注解的定义及使用
查看>>
阿里云移动端播放器高级功能---安全播放
查看>>
TiDB 在摩拜单车的深度实践及应用
查看>>
集成Netty|tensorflow实现 聊天AI--PigPig养成记(2)
查看>>
小白学Weex(一) —— 环境搭建
查看>>