Groovy преобразует XML в массив JSON

#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 }] }