jackson-annotations之@JsonInclude、@JsonPropertyOrder、@JsonSerialize
在实际开发过程中,为了更优雅的进行前后端交互,有时候前端只需要非空字段,并且希望有一定的顺序和枚举类字段的含义转换(例如:某字段在数据库保存的是一个数字,期望返回给前端的是这个数字的含义)
解决方案:
1)、实体类上使用@JsonInclude过滤为空的字段
2)、实体类上使用@JsonPropertyOrder对字段进行排序
3)、在需要转换的字段上使用@JsonSerialize并自定义json序列化,如果使用的是Mybatis-plus框架还有另一种解决方案,下一章演示
import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonPropertyOrder; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.sand.base.util.json.serializer.DataScopeSerializer;import java.util.Date; /** * 功能说明:系统角色 * 开发人员:@author liusha * 开发日期:2019/8/30 13:10 * 功能描述:系统角色 */ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonPropertyOrder({"roleId", "roleName", "roleKey", "orderNum", "status", "delFlag", "dataScope"}) public class SysRole { private static final long serialVersionUID = 9084971943250909716L; /** * 创建者 */ private String createBy; /** * 更新者 */ private String updateBy; /** * 创建时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; /** * 更新时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; /** * 备注信息 */ private String remark; /** * 角色ID **/ private String roleId; /** * 角色名称 **/ private String roleName; /** * 权限字符串 **/ private String roleKey; /** * 显示顺序 **/ private int orderNum; /** * 角色状态(0正常 1停用) **/ private String status; /** * 删除标志(0逻辑未删除 1逻辑已删除) **/ private String delFlag; /** * 数据范围(1:全部数据权限 2:自定数据权限 3:本部门数据权限 4:本部门及以下数据权限) **/ @JsonSerialize(using = DataScopeSerializer.class) private String dataScope;
/**省略get、set方法**/ }
自定义json序列化DataScopeSerializer.class
import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; /** * 功能说明:角色数据范围json序列化 * 开发人员:@author liusha * 开发日期:2019/9/1 18:24 * 功能描述:角色数据范围json序列化 */ public class DataScopeSerializer extends JsonSerializer<String> { @Override public void serialize(String dataScope, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { String dataScopeStr; switch (dataScope) { case "1": dataScopeStr = "全部数据权限"; break; case "2": dataScopeStr = "自定数据权限"; break; case "3": dataScopeStr = "本部门数据权限"; break; case "4": dataScopeStr = "本部门及以下数据权限"; break; default: dataScopeStr = "无此数据权限"; } jsonGenerator.writeString(dataScopeStr); } }
处理后的效果如下:
PS:关于jackson-annotations包其它API的使用可参考博文https://www.jianshu.com/p/939fe295d659
千万不要试图去研究 研究了很久都整不明白的东西,或许是层次不到,境界未到,也或许是从未在实际的应用场景接触过,这种情况下去研究,只会事倍功半,徒劳一番罢了。能做的就是不断的沉淀知识,保持一颗积极向上的学习心态,相信终有一天所有的困难都会迎刃而解。