Java開發(fā)中POJO和JSON互轉(zhuǎn)時(shí)如何忽略隱藏字段的問題

1. 前言
在Java開發(fā)中有時(shí)候某些敏感信息我們需要屏蔽掉,不能被消費(fèi)這些數(shù)據(jù)的客戶端知道。通常情況下我們會(huì)將其設(shè)置為null或者空字符 "",其實(shí)還有其它辦法,如果你使用了Jackson的話。接下來我將以一個(gè)實(shí)際場景來告訴你可以怎么做。
2. Jackson如何忽略字段
這里都以JSON序列化為例。假如我們在業(yè)務(wù)中需要返回用戶信息,已有的POJO是這樣的:
import lombok.Data;
/**
* @author felord.cn
*/
@Data
public class UserInfo {
/**
* userid
*/
private String userId;
/**
* 用戶名
*/
private String username;
/**
* 密鑰串
*/
private String secret;
/**
* 地址信息
*/
private String address;
}
業(yè)務(wù)場景:第三方通過用戶的userId來獲取用戶的信息,但是密鑰串secret顯然不能讓第三方知道,通常最容易想到的方法是將secret字段設(shè)置為null或者""。如果業(yè)務(wù)需要批量提供用戶信息,即List<UserInfo>,我們總不能每次都要遍歷一遍吧。Spring Boot內(nèi)置的Jackson可以很方便的幫我們處理這個(gè)問題。
使用@JsonIgnore注解
Jackson提供了一個(gè)@JsonIgnore注解,將它標(biāo)記到需要被忽略的字段上或者對應(yīng)的getter方法或者setter方法上就可以實(shí)現(xiàn)對該字段的屏蔽。就像下面這樣標(biāo)記:
@JsonIgnore
private String secret;
// 對應(yīng)json 樣例 {"userId":"100000","username":"felord.cn","address":"cn"}
無論是序列化(將POJO轉(zhuǎn)為JSON)還是反序列化((將JSON轉(zhuǎn)為POJO),secret都會(huì)被忽略。
使用@JsonIgnoreProperties注解
這個(gè)注解比@JsonIgnore更加強(qiáng)大一些,通常該注解標(biāo)記到POJO之上,它有更多的能力:
- 忽略多個(gè)字段,配置
value屬性即可。 - 忽略未知的屬性,配置
ignoreUnknown為true,默認(rèn)不忽略。 - 允許忽略字段被序列化,配置
allowGetters為true,序列化的時(shí)候不會(huì)被忽略。 - 允許忽略字段被反序列化,配置
allowSetters為true,反序列化的時(shí)候不會(huì)被忽略。
例如我們要忽略UserInfo中的secret和address,我們可以這樣配置:
@JsonIgnoreProperties({"secret", "address"})
使用@JsonProperty注解
需要Jackson版本不低于2.6
這個(gè)注解出鏡率還是非常高的,通常為了給JSON的字段起別名或者設(shè)置默認(rèn)值使用。比如UserInfo中的userId想對應(yīng)JSON中的user_id,我們可以:
@JsonProperty(value = "user_id") private String userId;
在2.6版本以后,這個(gè)注解也能實(shí)現(xiàn)忽略字段的作用。它有個(gè)access屬性,用來指定在序列化(“讀取”)和反序列化(“寫”)期間訪問權(quán)限(這里的讀寫是以屬性為視角)。它由枚舉Access定義:
public enum Access
{
/**
* 無論是序列化還是反序列化都會(huì)根據(jù)配置自動(dòng)的處理,默認(rèn)值。
*/
AUTO,
/**
* 意味著該屬性只能在進(jìn)行序列化時(shí)讀?。ㄍㄟ^“ getter”方法訪問的值,或者從字段中讀?。诜葱蛄谢? * 期間不能寫入(設(shè)置)。換句話說,這將反映“只讀POJO”,其中包含的值可以讀取但不能寫入。
*/
READ_ONLY,
/**
* 意味著該屬性只能作為反序列化的一部分寫入(設(shè)置)(使用“ setter”方法,或分配給Field,或作為 * Creator參數(shù)傳遞),而不會(huì)被讀取(獲?。┮赃M(jìn)行序列化,即,該屬性的值不包括在序列化中。
*/
WRITE_ONLY,
/**
* 可讀可寫,READ_ONLY與WRITE_ONLY的合并效果。
*/
READ_WRITE;
}
從這個(gè)注解中我們可以知道,如果你想在POJO轉(zhuǎn)JSON時(shí)忽略secret字段,就可以這么寫:
@JsonProperty( access = JsonProperty.Access.WRITE_ONLY) private String secret;
使用@JsonIgnoreType注解
這個(gè)注解是用來直接忽略類型的,如果上面的UserInfo是另外一個(gè)POJO的屬性,我們不希望它被序列化和反序列化,那么就可以:
@JsonIgnoreType
public class UserInfo {
// 省略
}
3. 總結(jié)
目前大概可知的Jackson有這么四種的忽略屬性的方式,它們有各自的使用場景,你可以根據(jù)自己的情況選擇使用。
到此這篇關(guān)于Java開發(fā)中POJO和JSON互轉(zhuǎn)時(shí)如何忽略隱藏字段的問題的文章就介紹到這了,更多相關(guān)Java中POJO和JSON互轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot項(xiàng)目中application.properties無法變成小樹葉問題解決方案
這篇文章主要介紹了springboot項(xiàng)目中application.properties無法變成小樹葉問題解決,本文通過圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09
如何解決SpringBoot2.x版本對Velocity模板不支持的方案
這篇文章主要介紹了如何解決SpringBoot2.x版本對Velocity模板不支持的方案,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-12-12
詳解json在SpringBoot中的格式轉(zhuǎn)換
這篇文章主要介紹了詳解json在SpringBoot中的格式轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Spring框架構(gòu)造注入操作實(shí)戰(zhàn)案例
這篇文章主要介紹了Spring框架構(gòu)造注入操作,結(jié)合具體實(shí)例形式分析了spring框架構(gòu)造輸入的相關(guān)定義與使用操作技巧,需要的朋友可以參考下2019-11-11
基于SpringMVC實(shí)現(xiàn)網(wǎng)頁登錄攔截
SpringMVC的處理器攔截器類似于Servlet開發(fā)中的過濾器Filter,用于對處理器進(jìn)行預(yù)處理和后處理。因此,本文將為大家介紹如何通過SpringMVC實(shí)現(xiàn)網(wǎng)頁登錄攔截功能,需要的小伙伴可以了解一下2021-12-12
Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列
這篇文章主要為大家詳細(xì)介紹了Java 1.8使用數(shù)組實(shí)現(xiàn)循環(huán)隊(duì)列,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10

