Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 序列化一个“;“狗”;就好像是一个",;动物“;使用Gson_Json_Subclass_Gson - Fatal编程技术网

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"}]