当前位置: 首页 > news >正文

SpringBoot中fastjson扩展: 自定义序列化和反序列化方法实战

❃博主首页 : 「码到三十五」 ,同名公众号 :「码到三十五」,wx号 : 「liwu0213」
☠博主专栏 : <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关>
♝博主的话 : 搬的每块砖,皆为峰峦之基;公众号搜索「码到三十五」关注这个爱发技术干货的coder,一起筑基

目录

      • 1. 扩展点的用途
      • 2. 序列化扩展点
        • 2.1. SerializeFilter
        • 2.2. SerializerFeature
        • 2.3. SerializeConfig
        • 2.4. 自定义序列化器(Serializer)
        • 2.5. 序列化过滤器(SerializeFilter)
        • 2.6. 自定义日期格式化
      • 2. 反序列化扩展点
        • 2.1. ParseProcess
        • 2.2. ParserConfig
        • 2.3. 自定义反序列化器(Deserializer)
        • 2.4. 解析过程(ParseProcess)

在fastjson库中,为了提供灵活的序列化和反序列化机制,设计了一系列的扩展点。以下是在SpringBoot和SpringClould环境中对这些扩展点的详细介绍及其实战使用:
在这里插入图片描述

1. 扩展点的用途

fastjson提供的这些扩展点为用户提供了极大的灵活性,可以根据实际需求定制序列化和反序列化的行为。SpringBoot和SpringClould环境中,可以通过SerializeFilterParserProcess定制复杂的序列化和反序列化逻辑,通过SerializerFeatureParserFeature控制序列化和反序列化的输出格式和特性,以及通过SerializeConfigParserConfig进行全局配置。这些扩展点不仅简化了用户代码,也提高了系统的可维护性和可扩展性。

2. 序列化扩展点

2.1. SerializeFilter
  • 用途:用于在序列化过程中定制输出,如过滤某些字段、修改字段值等。
  • 使用方法
    • 实现SerializeFilter接口或其子接口(如SimplePropertyPreFilterPropertyFilter等)。
    • 在序列化时,通过JSON.toJSONString等方法的重载版本传入自定义的SerializeFilter实例。
SerializeFilter filter = new SimplePropertyPreFilter() {@Overridepublic boolean accept(int index, JavaBeanSerializer beanSer, Object object, Object fieldName, Object fieldVal) {// 定制序列化逻辑return true; // 返回true表示保留该字段,false表示过滤}
};
String jsonStr = JSON.toJSONString(obj, filter);
2.2. SerializerFeature
  • 用途:控制序列化的输出格式和特性。
  • 使用方法
    • 在序列化时,通过JSON.toJSONString等方法的重载版本传入SerializerFeature枚举值来控制序列化特性。
String jsonStr = JSON.toJSONString(obj, SerializerFeature.PrettyFormat); // 格式化输出
2.3. SerializeConfig
  • 用途:全局配置序列化行为,如自定义序列化器、日期格式等。
  • 使用方法
    • 创建SerializeConfig实例并配置相关选项。
    • 在序列化时,通过JSON.toJSONString等方法的重载版本传入SerializeConfig实例。
SerializeConfig config = new SerializeConfig();
// 配置...
String jsonStr = JSON.toJSONString(obj, config);
2.4. 自定义序列化器(Serializer)

fastjson允许用户自定义序列化器,用于控制特定类型的序列化过程。用户需要实现SerializerFeature接口,并重写write方法。

public class CustomSerializer implements SerializerFeature {@Overridepublic void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {// 自定义序列化逻辑}
}

在序列化过程中,可以通过SerializerFeature枚举值来指定使用自定义序列化器。

String jsonStr = JSON.toJSONString(obj, SerializerFeature.CustomSerializer, new CustomSerializer());
2.5. 序列化过滤器(SerializeFilter)

序列化过滤器用于在序列化过程中修改序列化结果。用户需要实现SerializeFilter接口,并重写process方法。

public class CustomSerializeFilter implements SerializeFilter {@Overridepublic boolean process(Object source, String name, Object value, SerializeFilter.Context context) {// 自定义序列化过滤逻辑}
}

在序列化过程中,可以通过JSON.toJSONString方法的重载版本传入自定义序列化过滤器。

String jsonStr = JSON.toJSONString(obj, new CustomSerializeFilter());
2.6. 自定义日期格式化

fastjson允许用户自定义日期格式。可以通过SerializerFeature枚举值DisableCircularReferenceDetectWriteMapNullValue来指定日期格式。

String jsonStr = JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect, SerializerFeature.WriteMapNullValue);

此外,用户还可以通过DateFormat属性来指定全局的日期格式。

JSON.setDateFormat(new StdDateFormat());

2. 反序列化扩展点

2.1. ParseProcess
  • 用途:在反序列化过程中执行额外逻辑,如修改反序列化结果。

  • 使用方法

    • 实现ParseProcess接口并重写其中的方法。
    • 在反序列化时,通过JSON.parseObject等方法的重载版本传入ParseProcess实例。
  1. ParserFeature
  • 用途:控制反序列化的行为和特性。
  • 使用方法
    • 在反序列化时,通过JSON.parseObject等方法的重载版本传入ParserFeature枚举值来控制反序列化特性。
Object obj = JSON.parseObject(jsonStr, Object.class, Feature.AllowSingleQuotes); // 允许使用单引号
2.2. ParserConfig
  • 用途:全局配置反序列化行为,如自定义反序列化器、自动类型转换等。
  • 使用方法
    • 创建ParserConfig实例并配置相关选项。
    • 在反序列化时,通过JSON.parseObject等方法的重载版本传入ParserConfig实例。
ParserConfig config = new ParserConfig();
// 配置...
Object obj = JSON.parseObject(jsonStr, Object.class, config);

示例代码

这里提供一个简单的SerializeFilter示例,用于过滤某些字段:

SerializeFilter filter = new SimplePropertyPreFilter() {@Overridepublic boolean accept(int index, JavaBeanSerializer beanSer, Object object, Object fieldName, Object fieldVal) {if ("password".equals(fieldName)) {return false; // 过滤password字段}return true;}
};
String jsonStr = JSON.toJSONString(user, filter);
2.3. 自定义反序列化器(Deserializer)

类似地,fastjson也支持自定义反序列化器。用户需要实现ObjectDeserializer接口,并重写deserialze方法。

public class CustomDeserializer implements ObjectDeserializer {@Overridepublic Object deserialize(DefaultJSONParser parser, Type type, Object fieldName) {// 自定义反序列化逻辑}
}

在反序列化过程中,可以通过ParserConfig类的putDeserializer方法来注册自定义反序列化器。

ParserConfig.getGlobalInstance().putDeserializer(SomeType.class, new CustomDeserializer());
2.4. 解析过程(ParseProcess)

解析过程在反序列化过程中使用,用户可以实现ParseProcess接口并重写process方法来自定义解析逻辑。

public class CustomParseProcess implements ParseProcess {@Overridepublic Object process(ParseContext ctx) {// 自定义解析逻辑}
}

在反序列化过程中,可以通过JSON.parseObject方法的重载版本传入自定义解析过程。

Object obj = JSON.parseObject(jsonStr, SomeType.class, new CustomParseProcess());

总之,SpringBoot和SpringClould环境中,可以通过SerializeFilterParserProcess定制复杂的序列化和反序列化逻辑,通过SerializerFeatureParserFeature控制序列化和反序列化的输出格式和特性,以及通过SerializeConfigParserConfig进行全局配置。这些扩展点不仅简化了用户代码,也提高了系统的可维护性和可扩展性。


关注公众号获取更多技术干货 !

相关文章:

SpringBoot中fastjson扩展: 自定义序列化和反序列化方法实战

❃博主首页 &#xff1a; 「码到三十五」 &#xff0c;同名公众号 :「码到三十五」&#xff0c;wx号 : 「liwu0213」 ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a…...

【QT】鼠标按键事件 - QMouseEvent QKeyEvent

qt 事件 事件1. 事件概念2. 事件的处理3. 按键事件&#xff08;1&#xff09;单个按键&#xff08;2&#xff09;组合按键 4. 鼠标事件&#xff08;1&#xff09;鼠标单击事件&#xff08;2&#xff09;鼠标释放事件&#xff08;3&#xff09;鼠标双击事件&#xff08;4&#x…...

纯手工在内网部署一个Docker私有仓库

纯手工在内网部署一个Docker私有仓库 下载Docker仓库的镜像上传仓库的镜像导入仓库的镜像启动仓库镜像配置客户端的Docker上传镜像到本地仓库从本地仓库拉取镜像 下载Docker仓库的镜像 这个镜像不太好找&#xff0c;有需要的可以从下面的地址中下载。 通过百度网盘分享的文件…...

农林经济管理学报

《农林经济管理学报》是由江西省教育厅主管、江西农业大学主办、北京大学中国农业政策研究中心和中国人民大学农业与农村发展学院学术支持的农林经管类学术双月刊&#xff0c;以主要刊载农林经济政策与理论&#xff0c;反映农林经济管理前沿动态和研究成果&#xff0c;开展学术…...

【初阶数据结构题目】16.用队列实现栈

用队列实现栈 点击链接答题 思路&#xff1a; 出栈&#xff1a;找不为空的队列&#xff0c;将size-1个数据导入到另一个队列中。 入栈&#xff1a;往不为空队列里面插入数据 取栈顶元素&#xff1a; 例如&#xff1a; 两个队列&#xff1a; Q1&#xff1a;1 2 3Q2&#xff1a;…...

使用 OpenAI Whisper v2 模型进行中英文混合语音识别

https://huggingface.co/openai/whisper-large-v2 使用 OpenAI Whisper 模型进行中英文混合语音识别 在本篇博客中,我们将详细介绍如何使用 OpenAI 的 Whisper 模型进行中英文混合语音识别,并设置 Hugging Face 的缓存路径。 简介 Whisper 是 OpenAI 提供的一个强大的自动…...

代码随想录算法训练营day37|动态规划part05

完全背包问题&#xff1b; 第一题&#xff1a;518. Coin Change II class Solution {public int change(int amount, int[] coins) {//递推表达式int[] dp new int[amount 1];//初始化dp数组&#xff0c;表示金额为0时只有一种情况&#xff0c;也就是什么都不装dp[0] 1;fo…...

Git 如何提交代码

一. 简介 前面几篇文章简单学习了 git常用命令&#xff0c;文章如下&#xff1a; Git使用过程中涉及的几个区域-CSDN博客 Git常用命令的使用-CSDN博客 本文学习一下 如何使用 git命令&#xff0c;将本地代码提交到远程仓库。 二. 使用 git命令将本地代码提交到远程仓库中 …...

SpringBoot-application.properties为对象赋值

简单对象赋值 第一种方式 首先让该Bean交由Spring管理,然后加上ConfigurationProperties(prefix"前缀") <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId>&l…...

Head First设计模式学习笔记

Head First设计模式学习笔记 大家好&#xff0c;我是微赚淘客系统3.0的小编&#xff0c;是个冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 一、策略模式 策略模式定义了算法族&#xff0c;分别封装起来&#xff0c;让它们之间可以互相替换&#xff0c;此模式让…...

240806-RHEL 无法通过 ssh username@ip 远程连接,报错:Connection closed by ip port 22

A. 原因排查 遇到这个错误通常意味着 SSH 服务可能在目标主机上没有正常运行&#xff0c;或有防火墙/网络配置问题。以下是一些排查步骤&#xff1a; 检查 SSH 服务状态&#xff1a; 确认 SSH 服务是否正在目标主机上运行。 sudo systemctl status sshd重启 SSH 服务&#xff…...

C语言:复读机2种写法(输入什么就输出什么)

&#xff08;1&#xff09;题目&#xff1a;输入什么内容&#xff0c;输出就是什么内容&#xff0c;遇到"#"为止。输入一个随便的字符 &#xff08;2&#xff09;代码&#xff1a; 【1】getchar()和putchar() #include "stdio.h"int main() {char ch;pr…...

PySide6/PyQT学习笔记(很杂)

QGroupBox样式&#xff1a;科技机甲 QGroupBox { border: 2px solid #333; /* 深色边框&#xff0c;类似金属质感 */ border-radius: 8px; /* 轻微的圆角 */ background-color: #222; /* 暗色背景&#xff0c;模拟机甲内部或科技界面 */ color: #fff; /* 字体颜色为白色&a…...

学习笔记-JWT 保持登录状态

目录 一、解析 token 1. 在 JWT 工具类添加解析 token 的方法 2. 在 Controller 添加获取用户数据的方法 二、获取用户信息 1. 发起 axios 请求用户信息 2. 在路由守卫中调用方法 3. 使用 三、token 时效性 1. 设置 token 过期时间 2. 判断 token 是否过期 3. 在拦截…...

React 性能优化

使用 useMemo 缓存数据 &#xff08;类似 vue 的 computed&#xff09;使用 useCallback 缓存函数异步组件 ( lazy )路由懒加载( lazy )服务器渲染 SSR用 CSS 模拟 v-show 循环渲染添加 key使用 Fragment &#xff08;空标签&#xff09;减少层级 不在JSX 中定义函数&#xff0…...

后端常见问题及深度解决方案

&#x1f41f;作者简介&#xff1a;一名大三在校生&#xff0c;喜欢编程&#x1fab4; &#x1f421;&#x1f419;个人主页&#x1f947;&#xff1a;Aic山鱼 &#x1f420;WeChat&#xff1a;z7010cyy &#x1f988;系列专栏&#xff1a;&#x1f3de;️ 前端-JS基础专栏✨前…...

C:野指针介绍(定义、危害、规避)以及野指针与空指针的区分

目录 1、野指针 1.1 野指针的成因 1.指针未初始化 2.指针越界访问 3.指针指向的空间释放 1.2 野指针的危害 1.3 如何规避野指针 1. 指针初始化 2. 小心指针越界 3.指针变量不使用就及时赋上NULL 4. 指针使用前检查是否是空指针 5. 避免返回局部变量的地址 1.4 区…...

vue中v-html 后端返回html + script js中click事件不生效

效果图&#xff1a; 需求&#xff1a;点击加号执行后端返回的script中的代码 后端返回的html&#xff1a; <!DOCTYPE html> <html langzh> <head> <title>xxx</title> <style>body{font-size: 14px}p{text-indent: 30px;}textarea{width…...

介绍maven生命周期-水温

Maven生命周期是指一系列的构建阶段&#xff0c;包括项目的清理、编译、测试、打包、部署等。Maven通过定义生命周期来规范项目构建过程&#xff0c;使得开发人员可以方便地执行一系列的构建任务。 Maven的生命周期分为三个阶段&#xff1a; clean生命周期&#xff1a;主要用…...

spring boot3.x快速入门

下一篇&#xff1a;Spring Boot 3.x gradle脚手架工程build.gradle详解 本教程将基于gradle项目构建工具来快速构建一个spring boot 3.x的最简单的web应用&#xff0c;其中涉及各种构建技巧和细节&#xff0c;希望能帮到初学者~ 文章目录 先决条件JDK17gradle全局配置 gradle项…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

多场景 OkHttpClient 管理器 - Android 网络通信解决方案

下面是一个完整的 Android 实现&#xff0c;展示如何创建和管理多个 OkHttpClient 实例&#xff0c;分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

MySQL中【正则表达式】用法

MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现&#xff08;两者等价&#xff09;&#xff0c;用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例&#xff1a; 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...