Json 序列化一个“;“狗”;就好像是一个",;动物“;使用Gson
我有一个具体的基类,Json 序列化一个“;“狗”;就好像是一个",;动物“;使用Gson,json,subclass,gson,Json,Subclass,Gson,我有一个具体的基类,动物,还有几个子类狗,猫等等 Dog和Cat的细节是不相关的,因此我想用与Animals序列化相同的方式序列化这些子类的实例 有很多这样的子类,所以我更喜欢一个解决方案,不列出他们所有。基于动物实例的东西将是理想的。(从评论改为完整答案) 如果您永远不想将子类序列化为那些子类,而只想将其作为父类,只需将子类中的所有字段标记为transient——默认情况下Gson不会序列化它们 如果您希望能够以任何一种方式执行此操作,请使用Gson@Expose注释标记父类中的所有字段。然后
动物
,还有几个子类狗
,猫
等等
Dog
和Cat
的细节是不相关的,因此我想用与Animal
s序列化相同的方式序列化这些子类的实例
有很多这样的子类,所以我更喜欢一个解决方案,不列出他们所有。基于动物实例的东西将是理想的。(从评论改为完整答案)
如果您永远不想将子类序列化为那些子类,而只想将其作为父类,只需将子类中的所有字段标记为
transient
——默认情况下Gson
不会序列化它们
如果您希望能够以任何一种方式执行此操作,请使用Gson@Expose
注释标记父类中的所有字段。然后,在序列化时,您可以使用以下命令选择序列化的方式:
Gson gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
当您只希望在JSON中表示父类时 (从评论改为完整答案)
如果您永远不想将子类序列化为那些子类,而只想将其作为父类,只需将子类中的所有字段标记为
transient
——默认情况下Gson
不会序列化它们
如果您希望能够以任何一种方式执行此操作,请使用Gson@Expose
注释标记父类中的所有字段。然后,在序列化时,您可以使用以下命令选择序列化的方式:
Gson gson = GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
当您只希望在JSON中表示父类时 我的天真黑客,我只是为了好玩而编写代码(但如果性能不是问题的话,那值得一试)
我天真的黑客,我只是为了好玩而编写代码(但如果性能不是问题的话,那值得一试)
背景是什么?您是否试图在所有情况下将这些子类序列化为它们的父类?或者在运行时确定何时何地忽略子类类型而只是序列化为父类?在所有情况下都是一样的。(“编译时决策”)我不知道在任何情况下都可以通过编译时决策来实现。可以通过它的
@JsonSerialize(as)
注释来实现,但是在Gson中没有等价的(据我所知)。最好是通过GsonBuilder注册一个类型继承人适配器,以覆盖父类的序列化行为。这将基于一个解析器一个解析器地进行。如果您永远不想将它们序列化,除非将它们作为父类,那么可以将子类中的所有字段标记为transient
。如果出现这种情况,您可以在父级中使用@Expose
注释,并相应地使用GsonBuilder.excludeFieldsWithoutExposeAnnotation()
。上下文是什么?您是否试图在所有情况下将这些子类序列化为它们的父类?或者在运行时确定何时何地忽略子类类型而只是序列化为父类?在所有情况下都是一样的。(“编译时决策”)我不知道在任何情况下都可以通过编译时决策来实现。可以通过它的@JsonSerialize(as)
注释来实现,但是在Gson中没有等价的(据我所知)。最好是通过GsonBuilder注册一个类型继承人适配器,以覆盖父类的序列化行为。这将基于一个解析器一个解析器地进行。如果您永远不想将它们序列化,除非将它们作为父类,那么可以将子类中的所有字段标记为transient
。如果出现这种情况,您可以在父级中使用@Expose
注释,并相应地使用GsonBuilder.excludeFieldsWithoutExposeAnnotation()
。这似乎是一种“一次性”解决方案。不过我确实有一个打字机层次适配器。(Animal
不是此层次结构中的我的根类。)我打赌Dog
的实例将在序列化中有一个type=“Dog”
字段。反序列化端不会理解这一点。尽管如此,我还是要试试。是的,这让事情变得更复杂了。您可以进一步定义自己的排除策略
并使用自己的自定义注释。-不管怎样,这都可能是一点工作。说得对。现在我正在考虑显式列出所有子类,并让它们共享一个JsonSerializer,将它们视为动物
:-/这似乎是一个“一次性”解决方案。不过我确实有一个打字机层次适配器。(Animal
不是此层次结构中的我的根类。)我打赌Dog
的实例将在序列化中有一个type=“Dog”
字段。反序列化端不会理解这一点。尽管如此,我还是要试试。是的,这让事情变得更复杂了。您可以进一步定义自己的排除策略
并使用自己的自定义注释。-不管怎样,这都可能是一点工作。说得对。现在我正在考虑显式列出所有子类,并让它们共享一个JsonSerializer,将它们视为动物
:-/
Original string: [{"feet":4,"name":"Dog"},{"canSwim":true,"name":"fish"},{"feet":4,"name":"Dog"}]
New string: [{"name":"Dog"},{"name":"fish"},{"name":"Dog"}]