Android - 如何仅在JSON中序列化扩展类的显式字段

时间:2013-10-28 14:31:46

标签: java android json serialization extends

我有类似的课程:

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

2 个答案:

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