你如何声明一个使用Jackson XML的JsonTypeInfo.As.WRAPPER_OBJECT的多态字段?

我在一个用Kotlin编写的Android应用程序中接收XML消息,我试图弄清楚如何在不是根节点时使用Jackson的多态反序列化。

这是一个简单的例子。 假设我收到两种类型的消息(“数据”消息和“文本”消息):

<MSG> <TT> <id>3</id> <text>hi</text> </TT> </MSG> <MSG> <DT> <id>4</id> <data>93328afd0</data> </DT> </MSG> 

消息由它们的包装元素来区分,所以我设置了一些sealed class声明:

 @JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT) @JsonSubTypes( JsonSubTypes.Type(name = "TT", value = MT.TT::class), JsonSubTypes.Type(name = "DT", value = MT.DT::class)) sealed class MT { data class TT( val id: Int, val text: String ) : MT() data class DT( val id: Int, val data: ByteArray ) : MT() } data class MSG( // @JsonProperty("MSG") // @JsonUnwrapped // @JacksonXmlText val type: MT ) 

还有一个测试:

 @Test fun testJson() { val ser = XmlMapper().registerModule(KotlinModule()) println(ser.writerWithDefaultPrettyPrinter().writeValueAsString(MSG(MT.TT(3, "hi")))) println(ser.writerWithDefaultPrettyPrinter().writeValueAsString(MSG(MT.DT(3, byteArrayOf(0, 0, 1))))) val m = ser.readValue(""" |<MSG> | <TT> | <id>3</id> | <text>hi</text> | </TT> |</MSG> """.trimMargin(), MSG::class.java) println(m) } 

但是输出如下所示:

 <MSG> <type> <TT> <id>3</id> <text>hi</text> </TT> </type> </MSG> 

由于多态字段不是根,所以我创建了一个MSG根类,但是我不确定它的字段名称是什么,因为XML中的元素名称发生了变化。

我尝试使用@JsonUnwrapped ,但与JsonTypeInfo使用时会引发异常。

我也尝试@JacksonXmlText但不知何故被应用于<id>而不是<type>