杰克逊为什么需要在子类上使用JsonTypeName注解?

10

这个链接中,

我想要弄清楚为什么需要在子类上使用@JsonTypeName(就像所有“互联网”建议的那样),如果没有它也可以工作

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "aType")
@JsonSubTypes(Array(
  new Type(value = classOf[ModelA], name = "ModelA"),
  new Type(value = classOf[ModelB], name = "ModelB")
))
class BaseModel(val modelName:String)

//@JsonTypeName("SomeModel")  // Commented. Do I need this?
class ModelA(val a:String, val b:String, val c:String, commonData:String)  extends BaseModel(commonData) {
  def this() = this("default", "default", "default" ,"default")
}
//@JsonTypeName("SomeModel") // Commented. Do I need this?
class ModelB(val a:String, val b:String, val c:String, commonData:String)  extends BaseModel(commonData) {
  def this() = this("default", "default", "default" ,"default")
}

1
它们没有起作用吗?也就是说,您能否将带有“aType”:“ModelB”的JSON反序列化为正确的对象?存在大量的货物崇拜编程,有些可能曾经是必需的。 - zapl
是的,这个工作是“双向的”。我猜可能需要它。只想知道在哪种情况下需要。我猜这可能取决于JsonTypeInfo参数而不是Id.Name。 - ses
1个回答

20

不需要它们。

@JsonSubTypes.Type的文档解释:

定义子类型,以及可选名称。如果缺少名称,则将检查类型的类(JsonTypeName注解);如果也缺少或为空,则将通过类型ID机制构造默认名称。 默认名称通常基于类名。

您应该有其中之一:

@JsonSubTypes(Array(
  new Type(value = classOf[ModelA], name = "ModelA")

... 

class ModelA
或者
@JsonSubTypes(Array(
  new Type(value = classOf[ModelA])

... 

@JsonTypeName("ModelA")
class ModelA

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接