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
}
  • 欢迎大家来探讨,更好的方法,或者能优化的地方
相关推荐
2601_962056602 分钟前
可造成敏感信息泄露!Spring Boot之Actuator信息泄露漏洞三种利用方式总结
java·spring boot·后端
小小晓.22 分钟前
C++ 值类别与完美转发深度剖析:从左值右值到 std::forward 源码解密
开发语言·c++·算法
garmin Chen1 小时前
redis面试题
java·数据库·redis·缓存
格林威1 小时前
C# 相机Burst模式图像采集:使用相机内存配合OpenCvSharp和Halcon实现短时间的高速采集的方法
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
chen<>1 小时前
C++ 六种 memory_order:从原子性到线程间可见性.md
java·linux·开发语言·c++
一直C1 小时前
Linux系统编程|进程间通信IPC全套详解(1)(管道、信号)
linux·c语言·开发语言·网络·青少年编程·visual studio code
十年Java程序媛1 小时前
SpringBoot3 + JDK17 实战复盘:HikariCP 连接耗尽,虚拟线程场景额外注意事项
java·spring boot
m0_734571761 小时前
深入理解C++ 类型转换<三>const_cast
开发语言·c++
luj_17681 小时前
合法避税与投资评估实战指南
c语言·开发语言·网络·经验分享·算法
二十雨辰2 小时前
[Java]-JVM面试题
java·开发语言·jvm