POOPE 发表于 2021-8-17 11:28:17

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;
}
从这个注解中我们可以知道,如果你想在pojo转json时忽略secret字段,就可以这么写:


@jsonproperty( access = jsonproperty.access.write_only)
private string secret;
使用@jsonignoretype注解
这个注解是用来直接忽略类型的,如果上面的userinfo是另外一个pojo的属性,我们不希望它被序列化和反序列化,那么就可以:


@jsonignoretype
public class userinfo {
// 省略
}
3. 总结
目前大概可知的jackson有这么四种的忽略属性的方式,它们有各自的使用场景,你可以根据自己的情况选择使用。
到此这篇关于java开发中pojo和json互转时如何忽略隐藏字段的问题的文章就介绍到这了,更多相关java中pojo和json互转内容请搜索CodeAE代码之家
以前的文章或继续浏览下面的相关文章希望大家以后多多支持CodeAE代码之家


文档来源:服务器之家http://www.zzvips.com/article/180891.html
页: [1]
查看完整版本: Java开发中POJO和JSON互转时如何忽略隐藏字段的问题