在前后端开发中,常常会面临到枚举类型的数据交换,这里只讨论交换的数据格式为Json类型。
例如有一个枚举类型如下:
public enum SexEnum {
N("none","未知"),M("man","男"),W("women","女");
private final String code;
private final String desc;
SexEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
}
一、序列化
Jackson默认序列化枚举类型的name属性,如果要序列化成其他属性,只需要在序列化的字段或其Get方法上添加@JsonValue
注解。
例如需要序列化SexEnum的code属性,则代码如下:
public enum SexEnum {
N("none","未知"),M("man","男"),W("women","女");
@JsonValue
private final String code;
private final String desc;
SexEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
}
二、反序列化
Jackson默认通过枚举类型的name属性反序列化成枚举类型。
如果某个字段被@JsonValue
注解修饰,则通过该字段反序列化。
如果需要通过其他字段反序列化,则要生成一个静态方法,配置它的反序列化规则,并在这个方法上添加@JsonCreator
注解。
例如需要通过SexEnum的desc属性反序列化,则代码如下:
public enum SexEnum {
N("none","未知"),M("man","男"),W("women","女");
@JsonValue
private final String code;
private final String desc;
SexEnum(String code, String desc) {
this.code = code;
this.desc = desc;
}
@JsonCreator
public static SexEnum getItem(String s){
for (SexEnum value : SexEnum.values()) {
if (value.desc.equals(s)){
return value;
}
}
return SexEnum.N;
}
}