- 参考了Continew框架的源码,并加入了一些自己的理解
- fastjson2的注解文档,1.7部分
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
}
- 欢迎大家来探讨,更好的方法,或者能优化的地方