我有一个具体的基类,Animal
和几个子类Dog
,Cat
等等。
Dog
和的细节Cat
无关紧要,所以我想像序列化Animal
s 一样序列化这些子类的实例。
有很多这样的子类,所以我更喜欢没有列出所有子类的解决方案。基于 an 的东西instanceof Animal
将是理想的。
(从评论移至完整答案)
如果您不想将子类序列化为那些子类并且只作为父类,只需将子类中的所有字段标记为-transient
默认情况下Gson
不会序列化它们。
如果您希望能够做到这一点,请使用 Gson@Expose
注释标记父类中的所有字段。然后,当您序列化时,您可以使用以下命令选择序列化方式:
Gson gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
当您只希望在 JSON 中表示父类时。
我天真的 hack,我只是为了好玩而编码(但如果性能不是问题,那值得一试)。
public static void main(String[] args) {
ArrayList<Animal> al = new ArrayList<Animal>();
al.add(new Dog());
al.add(new Fish());
al.add(new Dog());
String originalString = new Gson().toJson(al);
System.out.println(originalString);
ArrayList<Animal> a = new ArrayList<Animal>();
Type listType = new TypeToken<List<Animal>>() {}.getType();
a = new Gson().fromJson(originalString, listType);
String newString = new Gson().toJson(a);
System.out.println(newString);
}
结果:
Original string: [{"feet":4,"name":"Dog"},{"canSwim":true,"name":"fish"},{"feet":4,"name":"Dog"}]
New string: [{"name":"Dog"},{"name":"fish"},{"name":"Dog"}]