将 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 元素不是您期望的顺序。
嗨,我是 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 元素不是您期望的顺序。