乐趣区

关于java:Java开发中POJO和JSON互转时如何忽略隐藏字段

  1. 前言

Java 开发中有时候某些敏感信息咱们须要屏蔽掉,不能被生产这些数据的客户端晓得。通常状况下咱们会将其设置为 null 或者空字符 "",其实还有其它方法,如果你应用了 Jackson 的话。接下来我将以一个理论场景来通知你能够怎么做。

  1. Jackson 如何疏忽字段

这里都以 JSON 序列化为例。如果咱们在业务中须要返回用户信息,已有的 POJO 是这样的:

import lombok.Data;

/**
 * @author felord.cn
 */
@Data
public class UserInfo {
    /**
     * userid
     */
    private String userId;
    /**
     * 用户名
     */
    private String username;
    /**
     * 密钥串
     */
    private String secret;
    /**
     * 地址信息
     */
    private String address;
}
复制代码

业务场景:第三方通过用户的 userId 来获取用户的信息,然而密钥串 secret 显然不能让第三方晓得,通常最容易想到的办法是将 secret 字段设置为 null 或者 ""。如果业务须要批量提供用户信息,即List<UserInfo>,咱们总不能每次都要遍历一遍吧。Spring Boot 内置的 Jackson 能够很不便的帮咱们解决这个问题。

应用 @JsonIgnore 注解

Jackson提供了一个 @JsonIgnore 注解,将它标记到须要被疏忽的字段上或者对应的 getter 办法或者 setter 办法上就能够实现对该字段的屏蔽。就像上面这样标记:

 @JsonIgnore
    private String secret;
   // 对应 json 样例  {"userId":"100000","username":"felord.cn","address":"cn"}
复制代码

无论是序列化 (将POJO 转为 JSON) 还是反序列化((将 JSON 转为 POJO),secret 都会被疏忽。

应用 @JsonIgnoreProperties 注解

这个注解比 @JsonIgnore 更加弱小一些,通常该注解标记到 POJO 之上,它有更多的能力:

  • 疏忽多个字段,配置 value 属性即可。
  • 疏忽未知的属性,配置 ignoreUnknowntrue,默认不疏忽。
  • 容许疏忽字段被序列化,配置 allowGetterstrue,序列化的时候不会被疏忽。
  • 容许疏忽字段被反序列化,配置 allowSetterstrue,反序列化的时候不会被疏忽。

例如咱们要疏忽 UserInfo 中的 secretaddress,咱们能够这样配置:

@JsonIgnoreProperties({"secret", "address"})
复制代码

应用 @JsonProperty 注解

须要 Jackson 版本不低于 2.6

这个注解出镜率还是十分高的,通常为了给 JSON 的字段起别名或者设置默认值应用。比方 UserInfo 中的 userId 想对应 JSON 中的user_id,咱们能够:

@JsonProperty(value = "user_id")
private String userId;
复制代码

在 2.6 版本当前,这个注解也能实现疏忽字段的作用。它有个 access 属性,用来指定在序列化(“读取”)和反序列化(“写”)期间拜访权限(这里的读写是以属性为视角 )。它由枚举Access 定义:

public enum Access {
    /**
     * 无论是序列化还是反序列化都会依据配置主动的解决,默认值。*/
    AUTO,

    /**
     * 意味着该属性只能在进行序列化时读取(通过“getter”办法拜访的值,或者从字段中读取),而在反序列化      * 期间不能写入(设置)。换句话说,这将反映“只读 POJO”,其中蕴含的值能够读取但不能写入。*/
    READ_ONLY,

    /**
     * 意味着该属性只能作为反序列化的一部分写入(设置)(应用“setter”办法,或调配给 Field,或作为          * Creator 参数传递),而不会被读取(获取)以进行序列化,即,该属性的值不包含在序列化中。*/
    WRITE_ONLY,

    /**
     * 可读可写,READ_ONLY 与 WRITE_ONLY 的合并成果。*/
    READ_WRITE;
}
复制代码

从这个注解中咱们能够晓得,如果你想在 POJOJSON时疏忽 secret 字段,就能够这么写:

@JsonProperty(access = JsonProperty.Access.WRITE_ONLY)
private String secret;
复制代码

应用 @JsonIgnoreType 注解

这个注解是用来间接疏忽类型的,如果下面的 UserInfo 是另外一个 POJO 的属性,咱们不心愿它被序列化和反序列化,那么就能够:

@JsonIgnoreType
public class UserInfo {// 省略}
复制代码
  1. 总结

目前大略可知的 Jackson 有这么四种的疏忽属性的形式,它们有各自的应用场景,你能够依据本人的状况抉择应用。

参考:《2020 最新 Java 根底精讲视频教程和学习路线!》

链接:https://juejin.cn/post/692485…

退出移动版