簡體   English   中英

Android-如何僅在擴展類的顯式字段中以JSON序列化

[英]Android - How to serialize in JSON only the explicit fields of an extended class

我有一些這樣的課程:

class A {
    String fieldA;
    String fieldB;
}

class B extends A {
    String fieldA;
    String fieldC;
}

我知道我可以避免兩次聲明fieldA,但就我而言,我必須這樣做。

在做的時候

JsonElement jsonElement = new JsonParser().parse(GsonSelector.getCurrentGson().toJson(auth, <The_Class>.class));

我顯然有

10-28 15:24:56.645: E/AndroidRuntime(11498): Caused by: java.lang.IllegalArgumentException: class <The_Class> declares multiple JSON fields named <Name>

因為在擴展類中,字段被聲明了兩次。

我的問題是:

如何只序列化擴展類的字段,而忽略父字段?

請記住,我還必須能夠從父類( A )進行序列化

尚不清楚為什么需要重復。 但是,您可以使用自定義解串器來實現所需的功能。 這里有一個例子。

我找到了可行的解決方案:

1我刪除了擴展依賴項(有了此解決方案,我就不再需要它了,這取決於您)

2創建了一個“更多根”類,該類僅包含我要在類之間共享且要避免的字段。

3在這些字段中添加了以下注釋:

@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface JsonIgnore {

}

4將我們創建的自定義注釋添加到JSON序列化器(反序列化器)的排除策略中

public class MyExclusionStrategy implements ExclusionStrategy {

    public boolean shouldSkipClass(Class<?> clazz) {
        return false;
    }

    public boolean shouldSkipField(FieldAttributes f) {
        return f.getAnnotation(JsonIgnore.class) != null;
    }

}

在前面的示例之后,如下所示:

class Root {
    @JsonIgnore
    String fieldA;
}

class A extends Root {
    String fieldA;
    String fieldB;
}

class B extends Root {
    String fieldA;
    String fieldC;
}

重復的字段“ fieldA”將不會序列化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM