Fastjson - 详解SerializeFilter,格式化对象字段
2019独角兽企业重金招聘Python工程师标准>>>
遇到一个奇葩场景,维护一个老的程序, 应用换了个服务方. 要切接口. 但有以下问题.
- 接口逻辑稍有不同 , 需要自己按原接口文档,重组逻辑.
- 接口字段名,字段类型改动较大. 但还要按原接口文档返回数据给前端.
接口逻辑改动还好 , 但这个转字段和类型 ,真的是头大啊.....
- 大小写: abcDef --> AbcDef , ABC-->abc
- 全称,缩写: result --> Res , detail --> DE,message --> msg
- 字段名称不同: 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,格式化对象字段相关推荐
- watch深度监听数组_vue watch普通监听和深度监听实例详解(数组和对象)
vue watch普通监听和深度监听实例详解(数组和对象) 下面通过一段代码给大家介绍vue watch的普通监听和深度监听,具体代码如下所示: var vm=new Vue({ data:{ num ...
- 43. Systemd的Unit配置详解,unit文件位置,优先级,unit类型,unit文件字段详解,Unit/Service/Install字段,添加mysql服务等例子
Systemd的Unit配置详解,unit文件位置和优先级,unit文件类型,unit文件字段详解,[Unit]字段,[Service]字段,[Install]字段,添加服务,创建.service 文 ...
- BULK INSERT用法详解,文本导入SQL,字段数量不等实例.
Bulk Insert命令详解 BULK INSERT 以用户指定的格式复制一个数据文件至数据库表或视图中. 语法 BULK INSERT [ [ 'database_name'.][ 'owner' ...
- Qlik GetSelectedCount 详解(用于查找字段中选定(绿色)值的数量)
文章目录 1 概述 1.1 维度 - 窗格 - 筛选图 1.2 常用语法 2 示例 2.1 基础数据准备 2.2 示例和结果 3 扩展 3.1 GetSelectedCount - 官方帮助文档 3. ...
- 详解jQuery.Deferred对象
一.前言 jQuery1.5之前,如果需要多次Ajax操作,我们一般会使用下面的两种方式: 1).串行调用Ajax $.ajax({ success: function() { $.ajax({ su ...
- Json学习总结(5)——阿里巴巴开源库 Fastjson详解
一.前言 JSON,全称:JavaScript Object Notation,作为一个常见的轻量级的数据交换格式,应该在一个程序员的开发生涯中是常接触的.简洁和清晰的层次结构使得 JSON 成为理想 ...
- formatter java_Java学习笔记之Formatter的用法详解(输出格式化)
java.util.Formatter (摘自sun主页) printf 风格的格式字符串的解释程序.此类提供了对布局对齐和排列的支持,以及对数值.字符串和日期/时间数据的常规格式和特定于语言环境的输 ...
- Java对象序列化详解6,Java对象的序列化与反序列化详解
把对象转换为字节序列的过程称为对象的序列化,把字节序列恢复为对象的过程称为对象的反序列化. 对象的序列化主要有两种途径: Ⅰ . 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中 Ⅱ. 在网 ...
- JVM系列之:详解java object对象在heap中的结构
文章目录 简介 对象和其隐藏的秘密 Object对象头 数组对象头 整个对象的结构 简介 在之前的文章中,我们介绍了使用JOL这一神器来解析java类或者java实例在内存中占用的空间地址. 今天,我 ...
最新文章
- Java 的 API、JDK 和 IDE 是什么
- 深入理解Java内存模型(四)——volatile
- 货郎担问题TSP(dp解法)
- 因为WPFe JavaScript到了不得不学的地步
- P5363-[SDOI2019]移动金币【阶梯博弈,dp,组合数学】
- Valgrind快速入门指南
- EXEC和sp_executesql的区别
- 滴滴“负重”387天
- linux基础之软件包管理
- 电影《邪不压正》打动我的
- superset汉化
- 什么是VOIP和SIP?
- 【一起学Java第二期】JDK的安装使用用记事本写第一个程序
- ABAP调用启信宝HTTP restful API实例
- 教你用PS制作雨天窗户上透明水滴字
- Python自制动漫头像~快帮女神制作一个专属头像~
- B2C购物商城---MMALL商城概览
- android zalo 分享sdk_zalo安卓版
- chartjs的canvas清空重绘
- android dpc camera,高分应用综合信息服务共享平台
热门文章
- Promise源码实现
- java 项目心得_读懂JAVA WEB项目的一点心得 | 学步园
- 若依前后端分离前端使用Vue3启动教程
- The valid characters are defined in RFC 7230 and RFC 3986-Tomcat解决方案
- Windows 计划任务
- orb特征 稠密特征_特征点的基本概念和如何找到它们
- 怎么查询服务器绑定的网站吗,服务器绑定网站吗
- 无法执行任何java命令,报错OutOfMemoryError: Cannot create GC thread. Out of system resources
- java调用指定浏览器打开指定网址
- java cache组件_组件之Cache篇