我知道它的设计谬误,但我必须处理它。父类和子类中都声明了相同的字段。但是,在序列化时,如果设置了孩子,我希望只包括孩子。
class Parent {
private int field;
}
class Child extends Parent {
private int field;
}
public class Main{
public static void main(String[] args){
Gson gson = new Gson();
Child child = new Child();
System.out.println(gson.toJson(child));
}
}
但上面的代码抛出错误,表明孩子有重复的字段。我已尝试使用排除策略,但它无法访问字段值以检查是否已设置。我该如何解决这个问题? P.S。 Gson是可选的。如果能给我所需的灵活性,我可以去任何其他图书馆。因此,欢迎图书馆建议。
答案 0 :(得分:0)
我认为你可以:
1)注册自定义JsonSerializer
:
private static class ChildSerializer implements JsonSerializer<Child> {
@Override
public JsonElement serialize(Child arg0, Type arg1, JsonSerializationContext arg2) {
JsonObject r = new JsonObject();
r.add("field", new JsonPrimitive(arg0.getField()));
return r;
}
}
public static void main(String[] args) {
Gson gson =
new GsonBuilder().registerTypeAdapter(
Child.class,
new ChildSerializer()
).create();
Child child = new Child();
System.out.println(gson.toJson(child));
}
这将正确序列化对象。
2)使用@SerializedName
Gson注释来序列化具有不同名称的子字段:
@SerializedName("childField")
private int field;
当然这意味着您必须在反序列化后更改逻辑,以便考虑反序列化对象的正确字段。 `
3)将字段更改为protected
?不知道它是否可行,但是当你只拥有父值或子值时,不会重复。