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有这么四种的忽略属性的方式,它们有各自的使用场景,你可以根据自己的情况选择使用。好了今天的分享就到这里,多多关注:码农小胖哥,获取更多的编程干货。
关注公众号:Felordcn 获取更多资讯
Java开发中POJO和JSON互转时如何忽略隐藏字段的更多相关文章
- paip.java 开发中web server的选择jboss resin tomcat比较..
paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...
- Java开发中常见的危险信号(中)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- Java开发中文件读取方式总结
JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...
- java开发中遇到的问题及解决方法(持续更新)
摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...
- Java开发中常见的危险信号(上)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]
完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络] 地址:http://blog.csdn.net/qq_35101189/article/details/53729720?ref=m ...
- Java 开发中的对象拷贝
前言 在 Java 开发中,很多时候需要将两个属性基本相同的对象进行属性复制,比如 DO 转 VO等等. 本文主要介绍自己实现的简易拷贝工具类与 Spring 提供的属性拷贝的对比. Spring 提 ...
- [ 转载 ] Java开发中的23种设计模式详解(转)
Java开发中的23种设计模式详解(转) 设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类 ...
随机推荐
- C语言3中循环语句的比较
(1)while和do-while循环只在while后面指定条件,在循环体中应包含使循环趋于结束的语句如(I++):for循环可以在表达式三中包含使循环趋于结束的操作,可以设置循环体中的操作全部放在语 ...
- 远程分支删除后,git branch -a还能看到的解决方法
详情https://www.cnblogs.com/wangiqngpei557/p/6058115.html 大家在删除远程分支后 git branch -a 还是可以看到已删除的远程分支,时间一长 ...
- WebRTC ICE 状态与提名处理
大家都知道奥斯卡有提名,其实在 WebRTC 的 ICE 中也有提名,有常规的提名,也有激进的提名,而且提名的候选人不一定是最优秀的候选人喔,本文就带你一探其中玄妙.文章内容主要描述 RFC 5245 ...
- 【Java】Java关键字、含义
Java关键字 来自 Java 核心技术卷I 基础知识(原书第10 版)/( 美)凯S 霍斯特曼(Cay S . Horstmann )著: 周立新等译一北京:机械工业出版社, 2016 . 8 Ja ...
- 解决ROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'creat table study_record( id int(11) not null
之前一直用的好好的,突然就出现了这个错误: ERROR 1064 (42000): You have an error in your SQL syntax; check the manual tha ...
- [Noip模拟题]Seq
题目描述 由于hyf长得实在是太帅了,英俊潇洒,风流倜傥,人见人爱,花见花开,车见车载.有一群MM排队看hyf.每个MM都有自己独特的风格,由于hyf有着一颗包容的心,所以,什么风格的MM他都喜欢-- ...
- Lakehouse: 统一数据仓库和高级分析的新一代开放平台
1. 摘要 数仓架构在未来一段时间内会逐渐消亡,会被一种新的Lakehouse架构取代,该架构主要有如下特性 基于开放的数据格式,如Parquet: 机器学习和数据科学将被作为头等公民支持: 提供卓越 ...
- ProBuilder快速原型开发技术 ---ProBuilder基础操作
在游戏开发.虚拟现实等三维仿真领域,Unity目前是国内外最为知名的开发引擎.随着版本的不断提升与完善,目前Unity2020等最新版本,又增加了很多令人惊奇的功能. Unity内置的ProBuild ...
- 前端面试之ES6新增了数组中的的哪些方法?!
前端面试之ES6新增了数组中的的哪些方法?! 我们先来看看数组中以前有哪些常用的方法吧! 1 新增的方法! 1 forEach() 迭代遍历数组 回调函数中的三个参数 value: 数组中的每一个元素 ...
- Java实现QQ邮件发送客户端
目录 一.前言:QQ邮件发送程序 二.封装SMTP操作 三.实现多线程接收 四.QQ邮件客户端界面设计 1.连接按钮 2.发送按钮 五.QQ邮件发送效果演示 六.总结 一.前言:QQ邮件发送程序 在上 ...