我有类似的课程:
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 )
答案 0 :(得分:0)
不太清楚为什么您需要复制。但是,您可以使用custom deserializer来实现您的目标。有一个例子here。
答案 1 :(得分:0)
我找到了一个可行的解决方案:
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”不会被序列化。