溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Gson序列化指定忽略字段的三種寫法是什么

發(fā)布時(shí)間:2021-10-26 13:41:41 來(lái)源:億速云 閱讀:278 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“Gson序列化指定忽略字段的三種寫法是什么”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“Gson序列化指定忽略字段的三種寫法是什么”吧!

目錄
  • 1. transient關(guān)鍵字

  • 2. expose注解

  • 3. 自定義排查策略ExclusionStrategy

在我們?nèi)粘J褂胘son序列化框架過(guò)程中,經(jīng)常會(huì)遇到在輸出json字符串時(shí),忽略某些字段,那么在Gson框架中,要想實(shí)現(xiàn)這種方式,可以怎么處理呢?

1. transient關(guān)鍵字

最容易想到的case,就是直接借助jdk的transient關(guān)鍵字來(lái)修飾不希望輸出的對(duì)象,如

@Data
@AllArgsConstructor
@NoArgsConstructor
public static class GItem {
    private String user;
    // @IgnoreField
    private transient String pwd;
}

上面的對(duì)象中,pwd前面使用transient進(jìn)行修飾,那么在輸出json串時(shí),默認(rèn)會(huì)忽略
@Test

public void testPrint() {
    GItem item = new GItem("一灰灰", "yihui");
    String ans = new Gson().toJson(item);
    System.out.println(ans);
}

輸出如

{"user":"一灰灰"}

2. expose注解

借助gson提供的expose注解,也可以實(shí)現(xiàn)上面的case,如在需要保留的字段上添加@Expose

@Data
@AllArgsConstructor
@NoArgsConstructor
public static class GItem {
    @Expose
    private String user;
    // @IgnoreField
    private String pwd;
}

然后我們使用的地方,注意通過(guò) GsonBuilder來(lái)創(chuàng)建Gson對(duì)象

@Test
public void testPrint() {
    GItem item = new GItem("一灰灰", "yihui");
    String ans = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create().toJson(item);
    System.out.println(ans);
}

上面這種使用姿勢(shì)感覺(jué)有點(diǎn)怪怪的,在需要保留的字段上添加注解,這種使用方式并沒(méi)有jackson的@JsonIgnore方式來(lái)得方便

3. 自定義排查策略ExclusionStrategy

除了上面兩種方式之外,通過(guò)自定義的排除策略可以實(shí)現(xiàn)即使不修改bean,也能指定哪些字段不序列化
一個(gè)簡(jiǎn)單的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) {
                // 包含這個(gè)注解的,直接忽略
                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));
}

上面這種姿勢(shì),更適用于有自定義需求場(chǎng)景的case,那么問(wèn)題來(lái)了,如果我希望序列化的對(duì)象,并不是JOPO對(duì)象,比如傳入的是一個(gè)Map,也希望針對(duì)某些key進(jìn)行忽略,可以怎么整呢?

感謝各位的閱讀,以上就是“Gson序列化指定忽略字段的三種寫法是什么”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)Gson序列化指定忽略字段的三種寫法是什么這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI