Gson序列化指定忽略字段的三種寫法詳解
在我們?nèi)粘J褂胘son序列化框架過程中,經(jīng)常會遇到在輸出json字符串時,忽略某些字段,那么在Gson框架中,要想實現(xiàn)這種方式,可以怎么處理呢?
本文介紹幾種常見的姿勢
1. transient關(guān)鍵字
最容易想到的case,就是直接借助jdk的transient關(guān)鍵字來修飾不希望輸出的對象,如
@Data @AllArgsConstructor @NoArgsConstructor public static class GItem { private String user; // @IgnoreField private transient String pwd; }
上面的對象中,pwd前面使用transient進(jìn)行修飾,那么在輸出json串時,默認(rèn)會忽略
@Test
public void testPrint() { GItem item = new GItem("一灰灰", "yihui"); String ans = new Gson().toJson(item); System.out.println(ans); }
輸出如
{"user":"一灰灰"}
2. expose注解
借助gson提供的expose注解,也可以實現(xiàn)上面的case,如在需要保留的字段上添加@Expose
@Data @AllArgsConstructor @NoArgsConstructor public static class GItem { @Expose private String user; // @IgnoreField private String pwd; }
然后我們使用的地方,注意通過 GsonBuilder來創(chuàng)建Gson對象
@Test public void testPrint() { GItem item = new GItem("一灰灰", "yihui"); String ans = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(item); System.out.println(ans); }
上面這種使用姿勢感覺有點(diǎn)怪怪的,在需要保留的字段上添加注解,這種使用方式并沒有jackson的@JsonIgnore方式來得方便
3. 自定義排查策略ExclusionStrategy
除了上面兩種方式之外,通過自定義的排除策略可以實現(xiàn)即使不修改bean,也能指定哪些字段不序列化
一個簡單的demo如下,如果包含自定義的注解,則不序列化,或者field_name == pwd也不序列化
@Target({ElementType.ANNOTATION_TYPE, ElementType.FIELD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface IgnoreField { } @Test public void testExclude() { Gson gson = new GsonBuilder().setExclusionStrategies(new ExclusionStrategy() { @Override public boolean shouldSkipField(FieldAttributes fieldAttributes) { if (fieldAttributes.getAnnotation(IgnoreField.class) != null) { // 包含這個注解的,直接忽略 return true; } // 成員白名單 if (fieldAttributes.getName().equalsIgnoreCase("pwd")) { return true; } return false; } @Override public boolean shouldSkipClass(Class<?> aClass) { if (aClass.isAnnotationPresent(IgnoreField.class)) { return true; } return false; } }).registerTypeAdapterFactory(new MyMapTypeAdapterFactory(new ConstructorConstructor(new HashMap<>()), false)).create(); GItem item = new GItem(); item.setUser("一灰灰"); item.setPwd("123456"); System.out.println(gson.toJson(item)); }
上面這種姿勢,更適用于有自定義需求場景的case,那么問題來了,如果我希望序列化的對象,并不是JOPO對象,比如傳入的是一個Map,也希望針對某些key進(jìn)行忽略,可以怎么整呢?
到此這篇關(guān)于Gson序列化指定忽略字段的三種寫法詳解的文章就介紹到這了,更多相關(guān)Gson序列化指定忽略字段內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringCloud讀取Nacos配置中心報錯及遇到的坑:Could?not?resolve?placehold
這篇文章主要介紹了SpringCloud讀取Nacos配置中心報錯:Could?not?resolve?placeholder?‘xxx’?in?value?‘${xxx},本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-03-03java Swing實現(xiàn)選項卡功能(JTabbedPane)實例代碼
這篇文章主要介紹了java Swing實現(xiàn)選項卡功能(JTabbedPane)實例代碼的相關(guān)資料,學(xué)習(xí)java 基礎(chǔ)的朋友可以參考下這個簡單示例,需要的朋友可以參考下2016-11-11spring基礎(chǔ)系列之JavaConfig配置詳解
本篇文章主要介紹了spring基礎(chǔ)系列之JavaConfig配置詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07Spring Cloud Zuul自定義過濾器的實現(xiàn)
這篇文章主要介紹了自定義Spring Cloud Zuul過濾器的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03java開發(fā)RocketMQ生產(chǎn)者高可用示例詳解
這篇文章主要為大家介紹了java開發(fā)RocketMQ生產(chǎn)者高可用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08在springboot中對kafka進(jìn)行讀寫的示例代碼
本篇文章主要介紹了在springboot中對kafka進(jìn)行讀寫的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-09-09

Java中l(wèi)ist根據(jù)id獲取對象的幾種方式