一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Gson序列化指定忽略字段的三種寫法詳解

Gson序列化指定忽略字段的三種寫法詳解

2022-03-01 00:27一灰灰 Java教程

在我們日常使用json序列化框架過程中,經常會遇到在輸出json字符串時,忽略某些字段,那么在Gson框架中,要想實現這種方式,可以怎么處理呢,本文就來介紹一下

在我們日常使用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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 校花的第一次好紧好爽 | 日本无遮挡亲吻膜下面免费 | 蜜月aⅴ免费一区二区三区 蜜桃影像传媒推广 | 秋葵污视频 | 日本人成年视频在线观看 | 兽皇日本 | 久久婷婷丁香五月色综合啪免费 | 91午夜在线观看 | 日韩亚洲人成在线综合 | 免费观看在线 | 国产激情在线 | 国产a一级 | a天堂在线视频 | 青青成人福利国产在线视频 | 美女大鸡鸡 | 耽美调教高h | 日韩欧美推理片免费看完整版 | 精品欧美小视频在线观看 | 好深快点再快点好爽视频 | 国产成人yy精品1024在线 | chinese男男gay | 亚洲国产自拍在线 | 含羞草国产亚洲精品岁国产精品 | 欧美日韩国产一区二区三区在线观看 | 免费看隐私男生网站 | 婷婷网址 | 人体欣赏孕妇季玥图片 | 免费看视频的 | 欧美精品一区二区三区免费播放 | 日韩免费在线视频观看 | 国产综合成人亚洲区 | 欧美日一级片 | 好吊妞视频998www | 精品精品国产自在久久高清 | 91久操| 亚洲 在线 日韩 欧美 | 日韩视频在线精品视频免费观看 | 厨房play黄瓜进去小说h | 高h舔穴| 成人日b视频 | 欧美精品久久一区二区三区 |