枚举处理序列化返回前端
背景
在平时的开发过程中,我们时常使用到枚举类,但是由于枚举类在开发的过程使用方便,前端显示就不是那么方便,前端不知道其里面具体的值,所有我们可以序列化为一个 json 对象进行传输。
现有一枚举类,通常我们都是接口直接返回给前端,前端显示的是 MALE 字符串,在其他枚举类特别多的情况下是很难区分的。
public enum Sex {
//每一个类型都是一个枚举类(Sex)的实例
MALE(1, "男"),
FMALE(0, "女");
//用于保存在数据库
private int SexCode;
//用于UI展示
private String SexName;
}
解决方案
我们可以序列化枚举类返回一个 json,前端方便识别进行中文展示。直接在枚举类上面加上这个注解
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
接口返回给前端就是一个对象。其中 content 类包含一个枚举类参数。
@Slf4j
@RestController
public class AiEntityController {
@PostMapping("/test")
public Content test(@RequestBody Content content) {
log.info(JSON.toJSONString(content));
return content;
}
}
接口返回值为
{
"name": "张三",
"age": 11,
"sex": {
"SexCode": 1,
"SexName": "男"
}
}
疑问
前端接收值展示没问题了,大部分前端更新值的时候也是这个 JSON 原样返回给后端,这是后端提示序列化失败。Deserializing enum Shape.OBJECT using Jackson fails
因为后端以枚举值作为传入值,其实只能识别 MALE 或者对应的 1 编码。对象值传回来需要指定序列化方式。
为啥要修改序列化方式?
前端同学不喜欢你传出的值和传入值不一样,这不是增加工作量吗,而且不好理解维护。
注意这里接入参数是 Map 类,也可以使用 Object 类(用来兼容旧数据处理)。 @JsonCreator 会识别 Sex 的时候主动调用一下这个方法进行处理一下映射值。
public enum Sex {
//每一个类型都是一个枚举类(Sex)的实例
MALE(1, "男"),
FMALE(0, "女");
//用于保存在数据库
private int SexCode;
//用于UI展示
private String SexName;
@JsonCreator
public static Sex fromObject(final Map<String, Object> obj) {
// 取值返回你自己的枚举略
return null;
}
}