• 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

        千万不要试图去研究 研究了很久都整不明白的东西,或许是层次不到,境界未到,也或许是从未在实际的应用场景接触过,这种情况下去研究,只会事倍功半,徒劳一番罢了。能做的就是不断的沉淀知识,保持一颗积极向上的学习心态,相信终有一天所有的困难都会迎刃而解。
  • 相关阅读:
    systemctl命令
    linux下常用命令查看端口占用
    【PostgreSQL】存取jsonb
    tomcat内存溢出之PermGen space
    Spring事务传播机制
    java框架篇---spring aop两种配置方式
    Hibernate一对多实例
    Github 的系统内部都在用什么开源软件?
    这是一个关于软件开发的博客。
    JavaScript中数组的集合和映射
  • 原文地址:https://www.cnblogs.com/54hsh/p/11443135.html
Copyright © 2020-2023  润新知