繁体   English   中英

想要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

返回:

{
    "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的飞行更新,但没有结束工作。 无论如何处理xml控制器并遵循gsp视图 但我认为Mr.Haki更优雅,并且有一些非常好的例子

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM