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"}}}])]) 
  • ¿Por qué agregar una Vista a mi layout cambia el ancho de todo el layout?
  • Usar puntos en identificadores xml
  • Agregar vista personalizada a includedView
  • XML a / desde Java / Kotlin, multiplataforma
  • GridLayout en Kotlin?
  • Forma dibujable en xml mismo código programáticamente
  • Error de ambigüedad de resolución de sobrecarga en kotlin
  • ¿Cómo declaras un campo polimórfico que usa JsonTypeInfo.As.WRAPPER_OBJECT con Jackson XML?
  • ¿Qué ventajas ofrece kotlin para la creación de templates XML?
  • Cómo convertir Java a Kotlin en controller
  • Cargue la configuration xml del muelle de forma dinámica