Java 如果使用子类型和泛型,则无法使用Jackson解析Json
我有这样的类层次结构:Java 如果使用子类型和泛型,则无法使用Jackson解析Json,java,json,kotlin,jackson,fasterxml,Java,Json,Kotlin,Jackson,Fasterxml,我有这样的类层次结构: @JsonIgnoreProperties(ignoreUnknown = true) @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY) @JsonSubTypes( JsonSubTypes.Type(value = SubClass1::class, name = "SC1"), JsonSubTypes.Type(value
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY)
@JsonSubTypes(
JsonSubTypes.Type(value = SubClass1::class, name = "SC1"),
JsonSubTypes.Type(value = SubClass2::class, name = "SC2")
)
interface Base
data class SubClass1(
@JsonProperty("i") val i: Int
) : Base
data class SubClass2(
@JsonProperty("s") val s: String
) : Base
我还有一些容器:
data class Container(
@JsonProperty("base") val base: Base
)
data class GenericContainer<T: Base> (
@JsonProperty("base") val base: T
)
因为json字符串不包含字段“@type”
关于这一点,我有两个问题:
val mapper = ObjectMapper()
// It works
val jsonStringSubClass = mapper.writeValueAsString(SubClass1(1)) // {"base":{"@type":"SC1","i":1}}
val subClassInstance = mapper.readValue(jsonStringSubClass, SubClass1::class.java)
println(subClassInstance) // SubClass1(i=1)
// It works too
val jsonStringContainer = mapper.writeValueAsString(Container(SubClass1(1))) // {"base":{"@type":"SC1","i":1}}
val containerInstance = mapper.readValue(jsonStringContainer, Container::class.java)
println(containerInstance) // Container(base=SubClass1(i=1))
// It works too
val jsonStringGenericContainer = mapper.writeValueAsString(GenericContainer(SubClass1(1))) // {"base":{"@type":"SC1","i":1}}
val genericType = mapper.typeFactory.constructParametricType(
GenericContainer::class.java,
SubClass1::class.java
)
val genericContainerInstance = mapper.readValue<GenericContainer<SubClass1>>(jsonStringGenericContainer, genericType)
println(genericContainerInstance) // GenericContainer(base=SubClass1(i=1))
data class GenericContainer<T> (
@JsonProperty("base") val base: T
)
com.fasterxml.jackson.databind.exc.InvalidTypeIdException: Could not resolve subtype of [simple type, class SubClass1]: missing type id property '@type' (for POJO property 'base')
at [Source: (String)"{"base":{"i":1}}"; line: 1, column: 15] (through reference chain: GenericContainer["base"])