Objeto POJO para esta respuesta XML en kotlin

Estoy trabajando con una API que devuelve XML algo como esto:

<xyz-objects version="1.0"> <object pk="1" model="roll"> <field type="BigIntegerField" name="roll_number">1000000714</field> <field type="CharField" name="status">DL</field> <field name="scans"> <object pk="1" model="scan_stages"> <field type="DateTimeField" name="updated_on">11 Jul, 2017, 17:40</field> </object> </field> </object> </xyz-objects> 

Estoy usando el mapeador XML de Jackson.

Intenté escribir un object POJO para esto, pero eso no funciona.

¿Cómo manejo los attributes de elementos como tipo y nombre? ¿Puedes ejemplificar?

Como no proporcionó el esquema, es difícil adivinar algunas partes de su model. Especialmente, es difícil adivinar el model de field . Por lo tanto, lo deserializaré en un object dynamic JsonNode que puede manejar literalmente todo. JsonIgnoreProperties en caso de que tenga algunos campos adicionales, no mencionados aquí.

Primero, crea algunas classs de datos:

 @XmlRootElement(name = "xyz-objects") @JsonIgnoreProperties(ignoreUnknown = true) data class XyzObjects( @JacksonXmlProperty(isAttribute = true) val version: String, @JsonProperty(value = "object") @JacksonXmlElementWrapper(useWrapping = false) val objects: List<Object> ) @XmlRootElement(name = "object") @JsonIgnoreProperties(ignoreUnknown = true) data class Object( @JacksonXmlProperty(isAttribute = true) val pk: String, @JacksonXmlProperty(isAttribute = true) val model: String, @JsonProperty(value = "field") @JacksonXmlElementWrapper(useWrapping = false) val fields: List<JsonNode> ) 

Respondiendo a su pregunta: puede manejar los attributes usando el atributo JacksonXmlProperty de JacksonXmlProperty . Las lists pueden manejarse con JacksonXmlElementWrapper + JsonProperty (no se deje engañar por su nombre, se usa para manejar plurales en nombres, lo que los hace más legibles en XML).

Para poder trabajar con classs de datos, deberá registrar el module Kotlin con registerKotlinModule :

 val text = """<xyz-objects version="1.0"> <object pk="1" model="roll"> <field type="BigIntegerField" name="roll_number">1000000714</field> <field type="CharField" name="status">DL</field> <field name="scans"> <object pk="1" model="scan_stages"> <field type="DateTimeField" name="updated_on">11 Jul, 2017, 17:40</field> </object> </field> </object> </xyz-objects>""" val mapper = XmlMapper().registerKotlinModule() val node = mapper.readValue<XyzObjects>(text) println(node) 

Se imprimirá:

 XyzObjects(version=1.0, objects=[Object(pk=1, model=roll, fields=[{"type":"BigIntegerField","name":"roll_number","":"1000000714"}, {"type":"CharField","name":"status","":"DL"}, {"name":"scans","object":{"pk":"1","model":"scan_stages","field":{"type":"DateTimeField","name":"updated_on","":"11 Jul, 2017, 17:40"}}}])]) 
  • Validar files XML grandes contra grandes XSD, ¿hay alguna manera rápida de hacerlo?
  • No se puede deshacer una colección de objects xml usando JAXB y Kotlin
  • Cómo convertir Java a Kotlin en controller
  • Forma dibujable en xml mismo código programáticamente
  • Kotlin: cadena de formatting
  • Error de image del elemento de RecyclerView
  • Usar puntos en identificadores xml
  • Los colors de Android Material Design no se aplican de forma coherente
  • ¿Puedo tener dos layouts xml usando el mismo visor usando extensiones sintéticas Kotlin?
  • ¿Por qué agregar una Vista a mi layout cambia el ancho de todo el layout?
  • SpringMVC RequestMapping: Añadiendo .xml a la ruta del controller para la respuesta xml