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
}
  • 欢迎大家来探讨,更好的方法,或者能优化的地方
相关推荐
写代码写到手抽筋3 分钟前
5G上行DCI字段判定:端口 流数 PMI选择详解
java·算法·5g
xieliyu.14 分钟前
Java算法精讲:双指针(二)
java·开发语言·算法
jeffer_liu39 分钟前
Spring AI 生产级实战:裁判员
java·人工智能·后端·spring·大模型
何以解忧,唯有..1 小时前
Python包管理工具pip:从入门到精通
开发语言·python·pip
雪的季节1 小时前
RabbitMQ详解
开发语言
小bo波2 小时前
枚举实战
java·设计模式·枚举·后端开发·代码重构
ice8130331812 小时前
【Python】Matplotlib折线图绘制
开发语言·python·matplotlib
夜微凉42 小时前
三、Spring
java·后端·spring
三品吉他手会点灯2 小时前
C语言学习笔记 - 44.运算符和表达式 - 运算符2 - 除法与取余运算符
c语言·开发语言·笔记·算法
kkeeper~2 小时前
0基础C语言积跬步之动态内存管理
c语言·开发语言