POJO-объект для этого XML-ответа в котлине

Я работаю с API, который возвращает XML примерно так:

<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> 

Я использую XML-транслятор Jackson.

Я попытался написать объект POJO для этого, но это не сработает.

Как обрабатывать атрибуты таких элементов, как тип и имя? Можете ли вы привести пример?

Поскольку вы не указали схему, трудно угадать некоторые части вашей модели. Особенно сложно угадать модель field . Поэтому я буду десериализовать его в JsonNode , динамическом объекте, который может обрабатывать буквально все. JsonIgnoreProperties всякий случай, если у вас есть дополнительные поля, не упомянутые здесь.

Во-первых, создайте несколько классов данных:

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

Отвечая на ваш вопрос: вы можете обрабатывать атрибуты с помощью атрибута JacksonXmlProperty для JacksonXmlProperty . Списки можно обрабатывать с помощью JacksonXmlElementWrapper + JsonProperty (не обманывайте себя именем, он используется для обработки множественных чисел в именах, что делает их более удобными для чтения в XML).

Чтобы иметь возможность работать с классами данных, вам необходимо зарегистрировать модуль Kotlin с помощью 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) 

Он напечатает:

 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"}}}])]) 
Intereting Posts
Kotlin: Как заменить уже открытый фрагмент на новый фрагмент в студии Android? Идиоматический способ обращения с нулевым или пустым списком в Котлин Привязка данных Android к Kotlin, BaseObservable и пользовательский делегат Ошибка подключаемого модуля Android kotlin Общая функция с общим двумерным массивом Невозможно запустить глобальное приложение hello, как показано в O'Reilly – Введение в программирование Kotlin Атрибут стирается после инициализации – kotlin Kotlin: зачем мне инициализировать var с помощью пользовательского getter? Поток Akka, выше по потоку, не производя значения Kotlin – Инициализация имущества с использованием «ленивым» и «lateinit» Kotlin @JvmStatic и случайное переопределение в сопутствующем объекте Boolean – Int конвертация в Котлин Как удалить дубликаты объектов с помощью clearBy из списка в Kotlin? Как разместить расширение Kotlin в файле класса? Когда именно ключевое слово оператора требуется в Котлине?