Groovy 将 XML 转换为 JSON 数组

Groovy convert XML to JSON Array

这是我的XML

<ErrorMessage>
   <Code>BUSINESS_EXCEPTION</Code>
   <Message>Invalid postcode - Invalid state</Message>
   <ExtendedStatus>
      <Code>48</Code>
      <Message>Invalid Postcode</Message>
   </ExtendedStatus>
   <ExtendedStatus>
      <Code>12</Code>
      <Message>Invalid State</Message>
   </ExtendedStatus>
</ErrorMessage>

正在尝试将其转换为以下 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() && !(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()

这么简单的格式,我只挑你的属性 感兴趣并对其进行改造。你的例子似乎没有显示任何 违规行为,这会让我做更多防御性的事情,比如检查 用于文本节点等

例如有一个功能可以构建“代码+消息”地图。然后迭代 ExtendedStatus 个节点并使用相同的函数收集:

def codeAndMessage(node) {
    [code: node.Code.text(),
     message: node.Message.text()]
}

def build(node){
    codeAndMessage(node) +
    [extendedMessages: node.ExtendedStatus.collect{ codeAndMessage it }]
}