2019独角兽企业重金招聘Python工程师标准>>>

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

  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://my.oschina.net/ElEGenT/blog/2120230

Fastjson - 详解SerializeFilter,格式化对象字段相关推荐

  1. watch深度监听数组_vue watch普通监听和深度监听实例详解(数组和对象)

    vue watch普通监听和深度监听实例详解(数组和对象) 下面通过一段代码给大家介绍vue watch的普通监听和深度监听,具体代码如下所示: var vm=new Vue({ data:{ num ...

  2. 43. Systemd的Unit配置详解,unit文件位置,优先级,unit类型,unit文件字段详解,Unit/Service/Install字段,添加mysql服务等例子

    Systemd的Unit配置详解,unit文件位置和优先级,unit文件类型,unit文件字段详解,[Unit]字段,[Service]字段,[Install]字段,添加服务,创建.service 文 ...

  3. BULK INSERT用法详解,文本导入SQL,字段数量不等实例.

    Bulk Insert命令详解 BULK INSERT 以用户指定的格式复制一个数据文件至数据库表或视图中. 语法 BULK INSERT [ [ 'database_name'.][ 'owner' ...

  4. Qlik GetSelectedCount 详解(用于查找字段中选定(绿色)值的数量)

    文章目录 1 概述 1.1 维度 - 窗格 - 筛选图 1.2 常用语法 2 示例 2.1 基础数据准备 2.2 示例和结果 3 扩展 3.1 GetSelectedCount - 官方帮助文档 3. ...

  5. 详解jQuery.Deferred对象

    一.前言 jQuery1.5之前,如果需要多次Ajax操作,我们一般会使用下面的两种方式: 1).串行调用Ajax $.ajax({ success: function() { $.ajax({ su ...

  6. Json学习总结(5)——阿里巴巴开源库 Fastjson详解

    一.前言 JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想 ...

  7. formatter java_Java学习笔记之Formatter的用法详解(输出格式化)

    java.util.Formatter (摘自sun主页) printf 风格的格式字符串的解释程序.此类提供了对布局对齐和排列的支持,以及对数值.字符串和日期/时间数据的常规格式和特定于语言环境的输 ...

  8. Java对象序列化详解6,Java对象的序列化与反序列化详解

    把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ.  在网 ...

  9. JVM系列之:详解java object对象在heap中的结构

    文章目录 简介 对象和其隐藏的秘密 Object对象头 数组对象头 整个对象的结构 简介 在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址. 今天,我 ...

最新文章

  1. Java 的 API、JDK 和 IDE 是什么
  2. 深入理解Java内存模型(四)——volatile
  3. 货郎担问题TSP(dp解法)
  4. 因为WPFe JavaScript到了不得不学的地步
  5. P5363-[SDOI2019]移动金币【阶梯博弈,dp,组合数学】
  6. Valgrind快速入门指南
  7. EXEC和sp_executesql的区别
  8. 滴滴“负重”387天
  9. linux基础之软件包管理
  10. 电影《邪不压正》打动我的
  11. superset汉化
  12. 什么是VOIP和SIP?
  13. 【一起学Java第二期】JDK的安装使用用记事本写第一个程序
  14. ABAP调用启信宝HTTP restful API实例
  15. 教你用PS制作雨天窗户上透明水滴字
  16. Python自制动漫头像~快帮女神制作一个专属头像~
  17. B2C购物商城---MMALL商城概览
  18. android zalo 分享sdk_zalo安卓版
  19. chartjs的canvas清空重绘
  20. android dpc camera,高分应用综合信息服务共享平台

热门文章

  1. Promise源码实现
  2. java 项目心得_读懂JAVA WEB项目的一点心得 | 学步园
  3. 若依前后端分离前端使用Vue3启动教程
  4. The valid characters are defined in RFC 7230 and RFC 3986-Tomcat解决方案
  5. Windows 计划任务
  6. orb特征 稠密特征_特征点的基本概念和如何找到它们
  7. 怎么查询服务器绑定的网站吗,服务器绑定网站吗
  8. 无法执行任何java命令,报错OutOfMemoryError: Cannot create GC thread. Out of system resources
  9. java调用指定浏览器打开指定网址
  10. java cache组件_组件之Cache篇