Java如何优雅的使用fastjson2进行枚举序列化/反序列化,欢迎探讨

java 复制代码
// 枚举接口
import com.alibaba.fastjson2.annotation.JSONField;
import java.io.Serializable;
import lombok.NonNull;

public interface BaseEnum<T extends Serializable> {
    @JSONField(value=true)  // 关键注解,使value字段主导序列化/反序列化
    @NonNull T getValue();
    @NonNull String getDescription();
}
java 复制代码
// 枚举
import com.baomidou.mybatisplus.annotation.EnumValue;

@Getter
@RequiredArgsConstructor
public enum EnumsTest implements BaseEnum<Integer> {
    NO(0, "哒咩!"),
    YES(1, "古德!"),
    ;
    
    @EnumValue  // 题外话,这个注解可以实现mybatis-plus读写数据库时的序列化/反序列化,可以用在Entity类中的字段
    private final Integer value;  // 实际序列化/反序列化的字段
    private final String description;  // 枚举简介/名称
}
java 复制代码
// 测试类
public class Bean1 {
	@NonNull
    public EnumsTest type;
}

@Test
public void test1() {
    Bean1 bean = new Bean1();
    bean.type = EnumsTest.NO;
    
    // 序列化
    String str = JSON.toJSONString(bean);
    assertEquals("{\"type\":0}", str);

	// 反序列化
    Bean1 bean1 = JSON.parseObject(str, Bean1.class);
    assertEquals(bean.type, bean1.type);
	
	// 为null的反序列化, @NonNull会抛出异常
	JSONObject jsonObj = JSONObject.parseObject(str);
	jsonObject.put("type", null);
	jsonObject.toJavaObject(Bean1.class);  // Caused by: java.lang.NullPointerException: type is marked non-null but is null

	// 枚举不存在的反序列化,抛出JSONException异常
	jsonObject.put("type", 777);
	jsonObject.toJavaObject(Bean1.class);  // Exception in thread "main" com.alibaba.fastjson2.JSONException: None enum ordinal or value 777
}
  • 欢迎大家来探讨,更好的方法,或者能优化的地方
相关推荐
辛苦才能2 分钟前
C++多态原理:虚函数表的内存布局与动态绑定的汇编真相
开发语言·c++
铲灰5 分钟前
做个总结而已
开发语言
IvanCodes14 分钟前
Python 文件操作(十二):文件与目录的读写
开发语言·python
右耳朵猫AI16 分钟前
Java周刊2026W38 | Micronaut 修补三漏洞、JDK 27 提速 54%、Jetty 修复抖动测试
java·后端·spring
事已至此先睡覺吧16 分钟前
第二篇:Java 基础语法:变量、数据类型、运算符与类型转换
java
Wang's Blog26 分钟前
Java 项目实战: 外卖平台-后台退出功能与首页iframe架构
java·服务器·redis
Wang's Blog28 分钟前
Java 项目实战: 外卖平台-软件开发流程与项目整体介绍
java·服务器·redis
她说..28 分钟前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
步行cgn29 分钟前
BeanFactory 与 FactoryBean 的区别:面试深度解析
java·后端·spring
IT 行者36 分钟前
JDK 27 正式发布:内存、安全、并发三路齐发
java