想要 Groovy MarkupBuilder() 等同于对象的 JSONBuilder()
Want Groovy MarkupBuilder() Equivalent to JSONBuilder() for Objects
目标:
鉴于下面的 myInfoObject 定义,我希望能够做到这一点:
println new groovy.xml.MarkupBuilder(myInfoObject).toPrettyString()
前提:
以下是 Groovy 对我的用例最令人惊奇和方便的功能之一:将复杂的嵌套对象出色地动态序列化为合理的 JSON。直接传对象,得到JSON。
示例 - 地图中的简单地图
import groovy.json.*
def myInfoMap = [
firstname : 'firstname',
lastname : 'lastname',
relatives : [
mother : "mom",
father : "dad"
]
]
myInfoJson = new JsonBuilder(myInfoMap)
//One line, straight to JSON object, no string writer/parser conversions
//Works on any object, extremely elegant, even handles deep nesting
//Alternatively, add .toPrettyString() for the string representation
Returns:
{
"firstname": "firstname",
"lastname": "lastname",
"relatives": {
"mother": "mom",
"father": "dad"
}
}
我已经通读了我能找到的所有 MarkupBuilder 示例和文档,但似乎没有 XML 的任何等效项。这是我能找到的最接近的,它几乎不一样。
http://www.leveluplunch.com/groovy/examples/build-xml-from-map-with-markupbuilder/
XML 和 JSON 有根本的不同,但是用 XML 以类似的方式表示对象仍然很常见。 XML 等价物至少需要一个可选参数来指定数据的表示方式,但我认为合理的默认值应该是这样的:
<myInfoMap>
<firstname>firstname</firstname>
<lastname>lastname</lastname>
<relatives>
<relative>
<mother>mom</mother>
</relative>
<relative>
<father>dad</father>
</relative>
</relatives>
</myInfoMap>
...必须在熟悉结构的情况下手动构建...
def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.myInfoMap {
myInfoMap.each{key, value ->
if (value instanceof Map){
"${key}"{
value.each{key2, value2 ->
"${key[0..key.size()-2]}"{
"${key2}" "${value2}"
}
}
}
}else{
"${key}" "${value}"
}
}
}
println writer.toString()
我什至试图变得聪明一点,让它有点动态,但你可以看到它与 JSONBuilder 示例相去甚远,即使是在简单的情况下也是如此。
如果目前这是不可能的并且没有人注意到,我将把我的第一个 JIRA 票作为功能请求提交给 Groovy 项目。只是想在我做之前确定一下。如果您认为这是下一步,请发表评论。
尝试grails.converters.XML
。你的情况:
def myInfoMap = [
firstname: 'firstname',
lastname : 'lastname',
relatives: [
mother: "mom",
father: "dad"
]
]
println new grails.converters.XML(myInfoMap)
会导致:
<?xml version="1.0" encoding="UTF-8"?>
<map>
<entry key="firstname">firstname</entry>
<entry key="lastname">lastname</entry>
<entry key="relatives">
<entry key="mother">mom</entry>
<entry key="father">dad</entry>
</entry>
</map>
抱歉,我可能错了,但 XmlUtil.serialize 我认为涵盖了您想要的内容。
MrHaki: groovy-goodness-pretty-print-xml
前段时间做了一些准备作为插件发布的工作,最后没有发布。在动态更新中使用 dns 进行了侧面跟踪,但最终无法正常工作。总之process xml controller and follow gsp view for it。但我认为 MrHaki 说得更优雅并且有一些非常好的例子
目标: 鉴于下面的 myInfoObject 定义,我希望能够做到这一点:
println new groovy.xml.MarkupBuilder(myInfoObject).toPrettyString()
前提:
以下是 Groovy 对我的用例最令人惊奇和方便的功能之一:将复杂的嵌套对象出色地动态序列化为合理的 JSON。直接传对象,得到JSON。
示例 - 地图中的简单地图
import groovy.json.*
def myInfoMap = [
firstname : 'firstname',
lastname : 'lastname',
relatives : [
mother : "mom",
father : "dad"
]
]
myInfoJson = new JsonBuilder(myInfoMap)
//One line, straight to JSON object, no string writer/parser conversions
//Works on any object, extremely elegant, even handles deep nesting
//Alternatively, add .toPrettyString() for the string representation
Returns:
{
"firstname": "firstname",
"lastname": "lastname",
"relatives": {
"mother": "mom",
"father": "dad"
}
}
我已经通读了我能找到的所有 MarkupBuilder 示例和文档,但似乎没有 XML 的任何等效项。这是我能找到的最接近的,它几乎不一样。 http://www.leveluplunch.com/groovy/examples/build-xml-from-map-with-markupbuilder/
XML 和 JSON 有根本的不同,但是用 XML 以类似的方式表示对象仍然很常见。 XML 等价物至少需要一个可选参数来指定数据的表示方式,但我认为合理的默认值应该是这样的:
<myInfoMap>
<firstname>firstname</firstname>
<lastname>lastname</lastname>
<relatives>
<relative>
<mother>mom</mother>
</relative>
<relative>
<father>dad</father>
</relative>
</relatives>
</myInfoMap>
...必须在熟悉结构的情况下手动构建...
def writer = new StringWriter()
def builder = new groovy.xml.MarkupBuilder(writer)
builder.myInfoMap {
myInfoMap.each{key, value ->
if (value instanceof Map){
"${key}"{
value.each{key2, value2 ->
"${key[0..key.size()-2]}"{
"${key2}" "${value2}"
}
}
}
}else{
"${key}" "${value}"
}
}
}
println writer.toString()
我什至试图变得聪明一点,让它有点动态,但你可以看到它与 JSONBuilder 示例相去甚远,即使是在简单的情况下也是如此。
如果目前这是不可能的并且没有人注意到,我将把我的第一个 JIRA 票作为功能请求提交给 Groovy 项目。只是想在我做之前确定一下。如果您认为这是下一步,请发表评论。
尝试grails.converters.XML
。你的情况:
def myInfoMap = [
firstname: 'firstname',
lastname : 'lastname',
relatives: [
mother: "mom",
father: "dad"
]
]
println new grails.converters.XML(myInfoMap)
会导致:
<?xml version="1.0" encoding="UTF-8"?>
<map>
<entry key="firstname">firstname</entry>
<entry key="lastname">lastname</entry>
<entry key="relatives">
<entry key="mother">mom</entry>
<entry key="father">dad</entry>
</entry>
</map>
抱歉,我可能错了,但 XmlUtil.serialize 我认为涵盖了您想要的内容。
MrHaki: groovy-goodness-pretty-print-xml
前段时间做了一些准备作为插件发布的工作,最后没有发布。在动态更新中使用 dns 进行了侧面跟踪,但最终无法正常工作。总之process xml controller and follow gsp view for it。但我认为 MrHaki 说得更优雅并且有一些非常好的例子