1

我有一些这样的课程:

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)进行序列化

4

2 回答 2

0

目前还不清楚为什么需要复制。但是,您可以使用自定义反序列化器来实现您想要的。此处提供了一个示例。

于 2013-10-28T14:46:59.827 回答
0

我找到了一个可行的解决方案:

1我删除了扩展依赖(有了这个解决方案,我不再需要它了,这取决于你)

2创建了一个“更多根”类,其中仅包含我想在类之间共享并且我想避免的字段。

3在这些字段中添加了以下注释:

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

}

4将我们创建的自定义注解添加到我们的JSON序列化器(deserializer)的排除策略中

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”将不会被序列化。

于 2013-10-28T15:04:14.013 回答