AI智能
改变未来

如何再Java POJO转JSON时忽略掉一些属性


1. 前言

Java开发中有时候某些敏感信息我们需要屏蔽掉,不能被消费这些数据的客户端知道。通常情况下我们会将其设置为

null

或者空字符

\"\"

,其实还有其它办法,如果你使用了Jackson的话。接下来我将以一个实际场景来告诉你可以怎么做。

2. 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

    属性即可。

  • 忽略未知的属性,配置
    ignoreUnknown

    true

    ,默认不忽略。

  • 允许忽略字段被序列化,配置
    allowGetters

    true

    ,序列化的时候不会被忽略。

  • 允许忽略字段被反序列化,配置
    allowSetters

    true

    ,反序列化的时候不会被忽略。

例如我们要忽略

UserInfo

中的

secret

address

,我们可以这样配置:

@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 {
   // 省略
}

3. 总结

目前大概可知的 Jackson 有这么四种的忽略属性的方式,它们有各自的使用场景,你可以根据自己的情况选择使用。好了今天的分享就到这里,多多关注:码农小胖哥,获取更多的编程干货。

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » 如何再Java POJO转JSON时忽略掉一些属性