文档章节

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

ol_O_O_lo
 ol_O_O_lo
发布于 09/21 10:09
字数 793
阅读 82
收藏 0

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

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

以数组定义的顺序执行

本文转载自:https://github.com/alibaba/fastjson/wiki/SerializeFilter

共有 人打赏支持
ol_O_O_lo
粉丝 3
博文 31
码字总数 11719
作品 0
杭州
高级程序员
私信 提问
fastjson-1.2.10版本发布,修复Bug,支持Class Level SerializeFilter

Bug Fixed 修复ValueFilter导致序列化数据丢失的问题,这个在1.2.9优化序列化引起。 修复某些场景下解析json中的注释出错。issue 559 修复WriteNonStringValueAsString特性打开时,非public类...

wenshao
2016/04/23
0
0
fastjson序列化原理详解

所有序列化的API都在JSON类中,方法名称为toJSONString,或者我们也可以设计自己的序列化方法,代码如下: public class MyJSON { public static String toJSONString(Object object, Seria...

拉风小野驴
2016/03/11
829
0
使用fastjson的filter机制将String属性转成复杂类型

今天遇到一个很棘手的问题,由于前期设计的失误,导致了数据库中的一个字段不得不用json存储一个非常复杂的对象,前端获取到复杂对象后利用json序列化成jsonstring后存到db中的字段 获取数据...

zimingforever
01/23
0
0
fastjson 1.1.50.android & 1.2.10 版本发布,修复 Bug,功能增强

fastjson 1.1.50.android & 1.2.10 版本发布。 fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。 fastjson-1.1.50.android 更新内容: 在之前发...

wenshao
2016/04/23
1K
4
使用TProfiler分析并调优项目中的Fastjson序列化代码

新项目年后就上线了,现在业务上没什么问题,就用[TProfiler][1]做了下性能分析,果然有坑。 一、TProfiler入门 高手请自觉略过本节。 1.简介 TProfiler是阿里巴巴开源的一款性能分析工具。号...

bfleeee
2015/02/15
0
0

没有更多内容

加载失败,请刷新页面

加载更多

mybatis学习(1)

JDBC连接方式: 1.底层没有使用连接池,操作数据库需要频繁的创建和关闭连接,消耗资源。 2.写原生的JDBC代码在JAVA中,一旦需要修改SQL的话(比如表增加字段),JAVA需要整体重新编译,不利...

杨健-YJ
18分钟前
0
0
怎么组织文档

可以从以下几个方面考虑组织文档: ☐ 各种分支的界面截图和对应的类及文件 ☐ 框架或类图 ☐ 流程图 ☐ 时序图 ☐ 注意事项

-___-
29分钟前
1
0
分布式之数据库和缓存双写一致性方案解析

引言 为什么写这篇文章? 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用。在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作。 但是在更新缓存方面,对于更...

别打我会飞
31分钟前
5
0
我的oracle11G,12c OCM之路

ocm认证感悟 ---------------------- 距离拿到ocm证书已经过了1年的时间,当初拿到证书的心情到现在还记得。其实在每个DBA心里都有一个成为强者的梦想,需要被认可,我也一样。我干过开发,做...

hnairdb
32分钟前
1
1
手动部署kubernetes集群(1.13.1最新版)

一、机器规划 使用五台机子部署k8s集群,规划如下: master节点3台(同时也是etcd节点) node节点2台 ip分配如下: ip:192.168.10.101,主机名:k8s-etcd01 ip:192.168.10.102,主机名:k8s...

人在艹木中
37分钟前
28
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部