应该从哪里读取JsonSubTypes?

时间:2018-07-27 11:54:23

标签: java json validation jackson polymorphism

这个问题与我之前发布的另一个问题背道而驰,因为我一直在寻找关于 JsonSubTypes

的序列化/验证工作方式的清晰性

其他问题:InvalidSchemaException using JsonSubTypes, not picking up what I defined in the base interface

假设我有一个基类 A

A实现 BaseInterface

如果我有一个扩展了 A 的子类 B ,但是实现了它自己的接口,例如 AlpahInterface,BetaInterface,CharlieInterface 。由于AlphaInterface仅列出例如LAMA,因此验证不了解基本BaseInterface中定义的所有其他类型。

子类 B 仅实现了 AlphaInterface 所定义的任何内容,而忽略了它扩展BaseInterface的事实,也忽略了其他已实现的接口,并且显然没有注意以下事实: B扩展了实现BaseInterface的A。我可以验证这一点,因为我向AlphaInterface添加了基本接口中定义的所有子类型,并且一切正常,但是我不想在每个接口中都定义所有可能的子类型,因为它们与实现它们的类并不都相关

我本以为将选择扩展A实现或所有B实现接口,而不仅仅是清单中的第一个接口。

请有人解释,因为我在过去两天在线上所做的所有阅读都还没有为我解决。如果有人想打开讨论聊天,那就太好了!

谢谢。

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
  @Type(value = CatTopic.class, name = "CAT"),
  @Type(value = DogTopic.class, name = "DOG"),
  @Type(value = FishTopic.class, name = "FISH"),
  @Type(value = LamaTopic.class, name = "LAMA")
})
public interface BaseInterface {}

@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
  @Type(value = LamaTopic.class, name = "LAMA")
})
public interface AlpahInterface extends BaseInterface {}


// Something to extend A
public class B extends A implements AlpahInterface, BetaInterface, CharlieInterface {}

1 个答案:

答案 0 :(得分:0)

我不清楚在JsonSubTypes的主要列表中应在何处读取此代码,但我设法解决了相关的发布问题。 最终在我的相关文章中找到了处理主要问题的方法。 public abstract @interface JsonTypeInfo

需要做的是对于JsonSubTypes中定义的每个类,还必须在该类上指定@JsonTypeName(“ ClassName”) 例如

@JsonTypeName("CAT")
public class CatTopic extends A implements AlpahInterface, BetaInterface, CharlieInterface {}