首页 > 基础资料 博客日记
java中的枚举序列化与反序列化(fastjson)
2024-10-05 16:00:07基础资料围观462次
这篇文章介绍了java中的枚举序列化与反序列化(fastjson),分享给大家做个参考,收藏Java资料网收获更多编程知识
想要达到的效果
注意使用的是fastjson
TestA这个类里面有一个字段,类型是一个枚举类EnumS,当使用JSON转String的时候,这个时候转出来的结果就是展示枚举的枚举名称
序列化
不要枚举名称,需要获取枚举中的内容,需要加上两种注解,分别为:
@JSONType(serializeEnumAsJavaBean = true)//加到枚举类上面
@JSONField(name = "枚举字段名")//加到枚举字段上面
完整版如下
import com.alibaba.fastjson.annotation.JSONField;
import com.alibaba.fastjson.annotation.JSONType;
/**
* @Version 1.0
* @Author:xh
* @Date:2024/4/11
* @Content:
*/
@JSONType(serializeEnumAsJavaBean = true)
public enum EnumS {
ONE(1, "one"),
TWO(2, "two");
@JSONField(name = "value")
private int value;
@JSONField(name = "name")
private String name;
EnumS(int value, String name) {
this.value = value;
this.name = name;
}
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
// 根据 value 查找对应的枚举常量
public static EnumS findByValue(int value) {
for (EnumS enumS : values()) {
if (enumS.getValue() == value) {
return enumS;
}
}
return null; // 或者抛出异常
}
}
此时的类转String已经是输出枚举内容
反序列化
根据我们序列化出的String内容,构建实体类
需要一个根据枚举中内容获取枚举的方法(可以为两个参数,也可以一个参数,找到枚举即可)
/ 根据 value 查找对应的枚举常量
public static EnumS findByValue(int value) {
for (EnumS enumS : values()) {
if (enumS.getValue() == value) {
return enumS;
}
}
return null; // 或者抛出异常
}
需要构建一个类用于自定义解析枚举内容
参考:
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.DefaultJSONParser;
import com.alibaba.fastjson.parser.deserializer.ObjectDeserializer;
import java.lang.reflect.Type;
/**
* @Version 1.0
* @Author:xh
* @Date:2024/4/11
* @Content:
*/
public class EnumSDeserializer implements ObjectDeserializer {
//返回结果修改为你自己的枚举类
@Override
public EnumS deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
JSONObject jsonObject = parser.parseObject();
if (jsonObject != null) {
int value = jsonObject.getIntValue("value");
int 枚举字段名 = jsonObject.getIntValue("枚举字段名");
// 使用 findByValue 方法查找枚举常量
return EnumS.findByValue(枚举字段名);
}
return null;
}
@Override
public int getFastMatchToken() {
return 0;
}
}
实体类里面的枚举字段也需要加一个注解
import com.alibaba.fastjson.annotation.JSONField;
import lombok.Data;
/**
* @Version 1.0
* @Author:xh
* @Date:2024/4/11
* @Content:
*/
@Data
public class TestA {
@JSONField(deserializeUsing = EnumSDeserializer.class)//这个类名是你的自定义解析枚举内容的类
public EnumS enumS;
}
执行结果
文章来源:https://blog.csdn.net/weixin_46348176/article/details/137673056
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
相关文章
最新发布
- springboot~3.x项目中使用集成测试
- Java测试类、工具类与JavaBean对比解析
- SpringBoot-日志
- springboot~http2的支持
- 解疑释惑 - 日志体系之 slf4j + logback 组合(一)
- Web server failed to start. Port 8080 was already in use. 端口被占用
- Springboot 项目配置多数据源
- 伙伴匹配系统(移动端 H5 网站(APP 风格)基于Spring Boot 后端 + Vue3 - 05
- 剑指offer-23、搜索⼆叉树的后序遍历序列
- 一个表示金额的数字是 100000000L,这是多少米?