¿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"):
- ¿Cómo analizar xml en la encoding de la aplicación Android?
- Validar files XML grandes contra grandes XSD, ¿hay alguna manera rápida de hacerlo?
- Objeto POJO para esta respuesta XML en kotlin
- ¿Puedo tener dos layouts xml usando el mismo visor usando extensiones sintéticas Kotlin?
- GridLayout en Kotlin?
<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>
.
- Cargue la configuration xml del muelle de forma dinámica
- problemas de layout y errores en aplicaciones de Android desarrolladas usando kotlin
- ¿Por qué agregar una Vista a mi layout cambia el ancho de todo el layout?
- Usar puntos en identificadores xml
- ¿Qué ventajas ofrece kotlin para la creación de templates XML?
- Parsing xml kotlin android
- Error de image del elemento de RecyclerView
- SpringMVC RequestMapping: Añadiendo .xml a la ruta del controller para la respuesta xml