您好我是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>
答案 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 元素不符合您期望的顺序的原因。