在我們日常使用json序列化框架過程中,經常會遇到在輸出json字符串時,忽略某些字段,那么在Gson框架中,要想實現這種方式,可以怎么處理呢?
本文介紹幾種常見的姿勢
1. transient關鍵字
最容易想到的case,就是直接借助jdk的transient關鍵字來修飾不希望輸出的對象,如
1
2
3
4
5
6
7
8
|
@Data @AllArgsConstructor @NoArgsConstructor public static class GItem { private String user; // @IgnoreField private transient String pwd; } |
上面的對象中,pwd前面使用transient進行修飾,那么在輸出json串時,默認會忽略
@Test
1
2
3
4
5
|
public void testPrint() { GItem item = new GItem( "一灰灰" , "yihui" ); String ans = new Gson().toJson(item); System.out.println(ans); } |
輸出如
{"user":"一灰灰"}
2. expose注解
借助gson提供的expose注解,也可以實現上面的case,如在需要保留的字段上添加@Expose
1
2
3
4
5
6
7
8
9
|
@Data @AllArgsConstructor @NoArgsConstructor public static class GItem { @Expose private String user; // @IgnoreField private String pwd; } |
然后我們使用的地方,注意通過 GsonBuilder來創建Gson對象
1
2
3
4
5
6
|
@Test public void testPrint() { GItem item = new GItem( "一灰灰" , "yihui" ); String ans = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(item); System.out.println(ans); } |
上面這種使用姿勢感覺有點怪怪的,在需要保留的字段上添加注解,這種使用方式并沒有jackson的@JsonIgnore方式來得方便
3. 自定義排查策略ExclusionStrategy
除了上面兩種方式之外,通過自定義的排除策略可以實現即使不修改bean,也能指定哪些字段不序列化
一個簡單的demo如下,如果包含自定義的注解,則不序列化,或者field_name == pwd也不序列化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
@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進行忽略,可以怎么整呢?
到此這篇關于Gson序列化指定忽略字段的三種寫法詳解的文章就介紹到這了,更多相關Gson序列化指定忽略字段內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://juejin.cn/post/7022955479923949599