将JSON数组转换为XML - Groovy

时间:2016-09-15 20:08:50

标签: json xml groovy soapui

您好我是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>

1 个答案:

答案 0 :(得分:1)

您可以尝试使用JsonSlurper JSON 遍历它,并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()

此代码返回在 XML 中转换的 JSON

<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 是一种更“免费”的格式,所以因为此JsonSlurper返回groovy.json.internal.LazyMap并不关心,因此其规格属性顺序不是强制性的。这就是 XML 元素不符合您期望的顺序的原因。