0

这是我的 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()
4

1 回答 1

1

对于如此简单的格式,我只会选择您感兴趣的属性并对其进行转换。您的示例似乎没有显示任何违规行为,这将使我做更多的防御性工作,例如检查文本节点等。

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

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

def build(node){
    codeAndMessage(node) +
    [extendedMessages: node.ExtendedStatus.collect{ codeAndMessage it }]
}
于 2021-11-05T08:18:01.533 回答