枚举处理序列化返回前端

背景

在平时的开发过程中,我们时常使用到枚举类,但是由于枚举类在开发的过程使用方便,前端显示就不是那么方便,前端不知道其里面具体的值,所有我们可以序列化为一个 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;
    }
}
上次更新时间: 2024/5/7 05:59:02