json - 想要 Groovy MarkupBuilder() 等同于对象的 JSONBuilder()

标签 json xml grails groovy markupbuilder

目标: 鉴于下面的 myInfoObject 定义,我希望能够做到这一点:

println new groovy.xml.MarkupBuilder(myInfoObject).toPrettyString()

前提:
以下是 Groovy 在我的用例中最令人惊奇和方便的特性之一: 将复杂的嵌套对象出色地动态序列化为合理的 JSON。只需传递对象,然后获取 JSON。

示例 - map 中的简单 map

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>

关于json - 想要 Groovy MarkupBuilder() 等同于对象的 JSONBuilder(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34305963/

相关文章:

javascript - 为什么我得到的是 "return _this.state.data"而不是 JSON 对象

python - XML 解析问题,某些孟加拉语字符在 Python ElementTree 中显示 ParseError

java - 使用按钮滚动后如何返回到 Activity 顶部?

javascript - java.lang.RuntimeException : Unable to start activity Component Info 错误

spring - Grails Spring-Grails应用程序运行时如何初始化Spring项目

Grails 2.2.0 URLMappings : Any way to use same URL with Different Verb

grails - grails getPersistentValue()值更改而不保存

php - 在php中取消设置编码数组后没有索引的json

ios - 避免 JSONSerialization 将 Bool 转换为 NSNumber

json - 将 PostgreSQL 中的 JSON 记录转换为表