¿Cómo declaras un campo polimórfico que usa JsonTypeInfo.As.WRAPPER_OBJECT con Jackson XML?

Recibo posts XML en una aplicación de Android escrita en Kotlin, y estoy intentando descubrir cómo usar la deserialization polimórfica de Jackson cuando no es el nodo raíz.

Aquí hay un ejemplo simplificado. Supongamos que recibo 2 types de posts (un post de "datos" y un post de "text"):

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

Los posts se distinguen por su elemento de ajuste, por lo que configuro algunas declaraciones de 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 ) 

Y una testing:

 @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) } 

Pero el resultado es así:

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

Debido a que el campo polimórfico no es la raíz, creo una class de raíz MSG , pero no estoy seguro de cuál es el nombre de su campo, ya que el nombre del elemento en el XML cambia.

Intenté usar @JsonUnwrapped , pero eso arroja una exception cuando se usa con JsonTypeInfo .

También probé @JacksonXmlText pero de alguna manera se aplica a <id> y no a <type> .