Как вы объявляете полиморфное поле, которое использует JsonTypeInfo.As.WRAPPER_OBJECT с Jackson XML?

Я получаю XML-сообщения в приложении для Android, написанном в Котлине, и я пытаюсь понять, как использовать полиморфную десериализацию Джексона, когда она не является корневым узлом.

Вот упрощенный пример. Скажем, я получаю 2 типа сообщений (сообщение «данные» и сообщение «текст»):

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

Сообщения отличаются своим оберточным элементом, поэтому я устанавливаю некоторые sealed class декларации 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 root, но я не уверен, какое имя его поле, так как имя элемента в XML изменяется.

Я попытался использовать @JsonUnwrapped , но это вызывает исключение при использовании с JsonTypeInfo .

Я также попытался @JacksonXmlText но каким-то образом применяется к <id> а не <type> .