#json #xml #groovy #xml-to-json
Вопрос:
Это мой XML
lt;ErrorMessagegt; lt;Codegt;BUSINESS_EXCEPTIONlt;/Codegt; lt;Messagegt;Invalid postcode - Invalid statelt;/Messagegt; lt;ExtendedStatusgt; lt;Codegt;48lt;/Codegt; lt;Messagegt;Invalid Postcodelt;/Messagegt; lt;/ExtendedStatusgt; lt;ExtendedStatusgt; lt;Codegt;12lt;/Codegt; lt;Messagegt;Invalid Statelt;/Messagegt; lt;/ExtendedStatusgt; lt;/ErrorMessagegt;
Попытка преобразовать его в следующий JSON
{ "code": "BUSINESS_EXCEPTION", "message": "Invalid postcode - Invalid state", "extendedMessages": [ { "code": "48", "message": "Invalid Postcode" }, { "code": "12", "message": "Invalid State" } ] }
Я пытаюсь использовать следующий код, но он не дает ожидаемого результата:
def toJsonBuilder(xml){ def pojo = build(new XmlParser().parseText(xml)) new groovy.json.JsonBuilder(pojo) } def build(node){ if (node instanceof String){ return // ignore strings... } def map = ['name': node.name()] if (!node.attributes().isEmpty()) { map.put('attributes', node.attributes().collectEntries{it}) } if (!node.children().isEmpty() amp;amp; !(node.children().get(0) instanceof String)) { map.put('extendedMessages', node.children().collect{build(it)}.findAll{it != null}) } else if (node.text() != ''){ map.put('message', node.text()) } map } toJsonBuilder(xml1).toPrettyString()
Ответ №1:
Для такого простого формата я бы выбрал только те атрибуты, которые вас интересуют, и преобразовал их. Ваш пример, похоже, не показывает никаких нарушений, что заставило бы меня делать больше защитных вещей, таких как проверка текстовых узлов и т. Д.
Например, есть одна функция для построения карты «код сообщение». Затем повторите ExtendedStatus
узлы и соберите их с помощью той же функции:
def codeAndMessage(node) { [code: node.Code.text(), message: node.Message.text()] } def build(node){ codeAndMessage(node) [extendedMessages: node.ExtendedStatus.collect{ codeAndMessage it }] }