1.场景
项目开发中给前端提供查询接口时,经常遇到需要将从数据库中取出来的字段值做一层重新封装。比如数据库中存的状态值是数字,返回给前端的时候,前端并不知道这个数值代表什么意思。此时,有两种方式:
(1)前端那边维护一个枚举,负责翻译后端返回的值;
(2)后端直接翻译好返回给前端。
这里,笔者的这篇博客针对第二种方式,提供一种优雅的字段处理方式。
举例:
笔者这里有个查询任务列表的接口,返回的任务列表里任务的状态值是0、1、2这样的数值,需要将这些数值翻译成“待完成”“已完成”“已延期”这样的中文,并返回给前端。
2.自定义序列化类
首先自定义一个序列化类TaskStatusSerializer,继承 JsonSerializer 类,并重写serialize接口。
注意:JsonSerializer类后面的泛型,取决于被转换的数值的类型。由于状态值是 0、1、2 ,也就是Integer类型,所以这里的泛型T直接传入Integer。
代码如下所示:
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
/**
* 任务状态序列化类
*
* @author: dong
* @date: 2023/2/20 21:11
* @since: 1.0
*/
public class TaskStatusSerializer extends JsonSerializer<Integer> {
@Override
public void serialize(Integer value, JsonGenerator gen, SerializerProvider serializers) throws IOException {
if (value == null) {
gen.writeString("未知的任务状态");
return;
}
switch (value) {
case 0:
gen.writeString("待完成");
break;
case 1:
gen.writeString("已完成");
break;
case 2:
gen.writeString("已延期");
break;
default:
break;
}
}
}
3.添加@JsonSerialize
在返回给前端的VO类里的任务状态字段上添加@JsonSerialize注解,并设置属性using 的值。
按照如下方式设置:
也就是说,按照如下方式设置,taskStatus在返回给前端的时候会使用TaskStatusSerializer这个自定义的序列化类进行封装。
public class TaskManageVO {
@JsonSerialize(using = TaskStatusSerializer.class)
private Integer taskStatus;
}