将 JSON 数组转换为 XML - Groovy

Convert JSON Array to XML - Groovy

嗨,我是 REST 的新手,JSON 回复。我以前做过基于 SOAP 的工作。我正在尝试将 JSON 数组主体转换为 XML。有人可以指导我在 Groovy 中使用那种代码吗?我已经看到了几个答案,但我无法针对我拥有的 JSON 正文适当地修改它们。任何帮助都感激不尽。谢谢!

样本JSON:

[
      {
      "field": "GULP",
      "baseDT":       {
         "name": "HaveAGulp",
         "descriptionTx": "Gulp the water",
         "flow":          {
            "beginDate": "2016-08-31",
            "endDate": "9999-12-31"
         },
         "check":          {
            "createUserId": "GULPUSER",
            "createTs": "2016-08-30 11:08:56.985204",
            "lastModifiedUser": "GULPUSER",
            "lastModifiedTs": "2016-08-30 11:08:56.985204"
         }
      }
   },
      {
      "field": "HELP",
      "baseDT":       {
         "name": "HelpSomeone",
         "descriptionTx": "Help Help Help",
         "flow":          {
            "beginDate": "2016-08-31",
            "endDate": "9999-12-31"
         },
         "check":          {
            "createUserId": "HELPUSER",
            "createTs": "2016-08-30 11:08:56.985204",
            "lastModifiedUser": "HELPUSER",
            "lastModifiedTs": "2016-08-30 11:08:56.985204"
         }
      }
   }
]

预期 XML:由于 JSON 中没有节点名称,我们仍然希望对 JSON 数组中的每个集合进行序列化索引。

<jsonAsXML>
    <0>
        <field>GULP</field>
        <baseDT>
            <name>HaveAGulp</name>
            <descriptionTx>Gulp the water</descriptionTx>
            <flow>
                <beginDate>2016-08-31</beginDate>
                <endDate>9999-12-31</endDate>
            </flow>
            <check>
                <createUserId>HELPUSER</createUserId>
                <createTs>2016-08-30 11:08:56.985204</createTs>
                <lastModifiedUser>HELPUSER</lastModifiedUser>
                <lastModifiedTs>2016-08-30 11:08:56.985204</lastModifiedTs>
        </baseDT>
    </0>
    <1>...
    </1>
</jsonAsXML>

您可以尝试使用 JsonSlurper to get the JSON to traverse it, and Markupbuilder 将其保存为 XML。这只是一个例子,并没有考虑到所有的可能性,因为我假设你在你的例子中展示了你的 JSON 根总是 Array.

import groovy.json.*
import groovy.xml.*

def json = '''[
      {
      "field": "GULP",
      "baseDT":       {
         "name": "HaveAGulp",
         "descriptionTx": "Gulp the water",
         "flow":          {
            "beginDate": "2016-08-31",
            "endDate": "9999-12-31"
         },
         "check":          {
            "createUserId": "GULPUSER",
            "createTs": "2016-08-30 11:08:56.985204",
            "lastModifiedUser": "GULPUSER",
            "lastModifiedTs": "2016-08-30 11:08:56.985204"
         }
      }
   }
]'''

// parse your json
def slurper = new JsonSlurper().parseText(json)

// recursive helper to traverse the structure
def helper(map){
    return {
        map.each{ k,v ->
            println "$k $v"
            if(v instanceof Map){
                "$k" helper(v)
            }else if(v instanceof List){
                v.each{ element ->
                    "$k" helper(element)
                }
            }else{
                "$k"("$v")
            }
        }
    }
}

StringWriter writer = new StringWriter()
new MarkupBuilder(writer).jsonAsXml {
    // for each element in the json array
    slurper.eachWithIndex { content, index ->
        "$index"( helper(content) )
    }
}

println writer.toString()

这段代码returns你的JSON转化为XML:

<jsonAsXml>
  <0>
    <baseDT>
      <check>
        <createTs>2016-08-30 11:08:56.985204</createTs>
        <createUserId>GULPUSER</createUserId>
        <lastModifiedTs>2016-08-30 11:08:56.985204</lastModifiedTs>
        <lastModifiedUser>GULPUSER</lastModifiedUser>
      </check>
      <descriptionTx>Gulp the water</descriptionTx>
      <flow>
        <beginDate>2016-08-31</beginDate>
        <endDate>9999-12-31</endDate>
      </flow>
      <name>HaveAGulp</name>
    </baseDT>
    <field>GULP</field>
  </0>
</jsonAsXml>

注意XML通常有一个xsd 然而 JSON 是一种更 "free" 的格式,因此在它的规范中属性顺序不是强制性的,因为 JsonSlurper returns groovy.json.internal.LazyMap 哪个不关心。这就是为什么 XML 元素不是您期望的顺序。