Fastjson枚举序列化和反序列化的推荐实现

news/2024/10/30 10:18:13/文章来源:https://www.cnblogs.com/lovefoolself/p/18515219

一、背景

项目中定义了很多dto,包含枚举类型,而且这些枚举全都自定义标志码。比如7001 对应 某种操作。返回前台时,需要转化为对应的7001,前台传入后台时也希望7001转化为枚举。

二、研究思路

一开始,研究了fastjson的默认实现。发现只有不自定义类似7001这种默认值的时候,可以自动转化。
阅读了网上大量资料,笔者认为定义一个通用的序列化和发序列化器是最好的实现

三、实现

1.自定义的枚举状态码 全部定义 value字段 ,定一个通用的接口实现 getValue
image
2.自己的枚举实现这个接口
image
3.定义序列化器,需要带泛型,这样才通用

public class BaseEnumDeserializer<T extends Enum<T> & EnumWithValue> implements ObjectDeserializer {private final Class<T> enumClass;public BaseEnumDeserializer(Class<T> enumClass) {this.enumClass = enumClass;}@Overridepublic T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {// 解析为intint value = parser.parseObject(int.class);// 遍历所有的枚举实例for (T  itemEnum: enumClass.getEnumConstants()) {if (itemEnum.getValue() == value) {// 成功匹配,返回实例return (T) itemEnum;}}// 没有匹配到,可以抛出异常或者返回nullreturn null;}@Overridepublic int getFastMatchToken() {// 处理匹配int值return JSONToken.LITERAL_INT;}
}
public class BaseEnumSerializer<T extends Enum<T> & EnumWithValue> implements ObjectSerializer {@Overridepublic void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {// 强制把值转换为枚举T itemEnum = (T) object;// 序列化为自定义的code属性,输出就行serializer.write(itemEnum.getValue());}
}

4.在定义的dto里面的枚举字段上面加上解析器注解
image

四、后记

fastjson还是没有微软的newsoftjson好用,需要自己做大量的工作。这个实现算不错的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/824036.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第13课—数据库之索引

一、索引的介绍 1、什么是索引? (1)定义:索引是一种数据结构 一个索引在存储的表中的数据结构; (2)索引是在表的字段上创建的 (3)索引包含了一列值,这个值保存在一个数据结构中 2、索引作用? (1)保证数据记录的唯一性 (2)实现表与表之间的参照性 (3)减少排序和…

触觉智能SOM3588S鸿蒙核心板现已上市,RK3588S八核6T超高算力!

触觉智能SOM3588S鸿蒙核心板,搭载瑞芯微RK3588S芯片,采用4.5*5cm超小尺寸邮票孔+LGA封装,10层盲埋孔沉金工艺!内置八核64位CPU,Mali-G610四核GPU,6T超高算力NPU,广泛应用边缘计算、人工智能、云计算、虚拟/增强现实等行业深圳触觉智能SOM3588S鸿蒙核心板现已上市,搭载瑞…

2个月搞定计算机二级C语言——真题(6)解析

1. 前言 本篇我们讲解2个月搞定计算机二级C语言——真题 62. 程序填空题 2.1 题目要求2.2 提供的代码 #include <stdio.h> unsigned long fun(unsigned long n) {unsigned long x = 0;int t;while (n) {t = n % 10;/**********found**********/if (t % 2 == __…

5秒激活Win10

按住 Win+X ,选择 windows powershell(管理员), 输入 irm utools.run/win | iex (| 是 Enter键盘上的那个键,按住Shift+Enter上面的那个键,不行就复制粘贴)KMS激活脚本最大特色是代码开源,小巧不误报。三种激活方式分别是 :HWID数字许可证永久激活、KMS38激活至2038年、…

说透性能测试:每个测试人都能学好的性能测试!

1、提起性能测试,你的第一反应是什么? 当提到性能测试,你的第一反应是什么?是不屑一顾,认为它很简单,没发展前途、没技术含量?还是觉得它太难了,高不可攀,每当遇到系统的疑难杂症时,抓耳挠腮,无从下手? 很多IT从业人员,认为"性能测试仅仅只是测试的工作,会用…

设计卷积神经网络CNN为什么不是编程?

上一篇:《搞清楚这个老六的真面目!逐层‘剥开’人工智能中的卷积神经网络(CNN)》 序言:现在让我们开始走进卷积神经网络(CNN)的世界里。和传统编程完全不同,在人工智能的程序代码里,您看不到明确的算法规则,看到的只是神经网络的配置说明。这里的代码不会像传统编程那…

11 编程语言发展史

硬件编程太麻烦,想要做出软件, 早期先写伪代码用语言指令,然后用操作码表把语言转化为二进制机器代码,翻译完成后将打孔指代上的程序插入计算机; 后来每个操作码分配一个名字叫助记符,助记符后面跟着数据,形成完整指令; 但机器只能理解二进制,理解不了语言(助记符),…

为什么新建的Excel默认是xlsm格式?Excel新建或保存为xlsm格式的解决方法

.xlsm格式是Excel中的一种特殊文件格式,它支持宏(Macro)功能,而最近一些小伙伴发现自己无论是新建还是另存保存的格式xlsx会自动变成xlsm后缀格式,那么这种情况要如何才能够解决呢?不清楚的小伙伴下面就来试试小编的方法吧。【更多精品素材欢迎前往办公之家下载】Excel新…

基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式

时间序列数据表示了一个随时间记录的值的序列。理解这些序列内部的关系,尤其是在多元或复杂的时间序列数据中,不仅仅局限于随时间绘制数据点(这并不是说这种做法不好)。通过将时间序列数据转换为图,我们可以揭示数据片段内部隐藏的连接、模式和关系,帮助我们发现平稳性和时间连…

微软开放 Android in File Explorer:Win10 / Win11 文件管理器可无线管控安卓手机存储

万象系统之家 10 月 29 日消息,微软公司已逐步面向所有 Windows 10、Windows 11 用户,开放“Android in File Explorer”,让用户不需要借助 USB 数据线,就能在文件管理器中操作安卓手机存储。微软的 Android 文件资源管理器集成功能为用户提供了更便捷的跨设备文件管理体验…

《使用Gin框架构建分布式应用》阅读笔记:p251-p271

《用Gin框架构建分布式应用》学习第14天,p251-p271总结,总21页。 一、技术总结 1.Docker & Docker Compose version: "3.9" services:api:image: apienvironment:- MONGO_URI=mongodb://admin:password@mongodb:27017/test?authSource=admin&readPreferen…