9

我一直在尝试使用 groovy Jsonbuilder ,如下所示,尝试查看构建 JSON 对象和数组的不同方法。在事情开始变得有意义之后,我尝试扩展到下面显示的内容。我的问题是,为什么“内容”会出现在 json 漂亮的字符串输出中?我实际上有另一个 json 对象在 json 字符串输出中显示 this.class 信息。

有任何想法吗?我是新手,所以它肯定是一个显而易见的。

def tt = ["test", "test1"]
def jjj = "jason"
def js3 = new groovy.json.JsonBuilder()
def js2 = new groovy.json.JsonBuilder(tt);
js3 hello: "$jjj", "$jjj": tt
def js4 = new groovy.json.JsonBuilder()
def result = js4([sdn: js3, openflow: js2, type: 3])
println js4.toPrettyString();

输出:

{
    "sdn": {
        "content": {
            "hello": "jason",
            "jason": [
                "test",
                "test1"
            ]
        }
    },
    "openflow": {
        "content": [
            "test",
            "test1"
        ]
    },
    "type": 3
}
4

1 回答 1

13

问题可以重述为...

为什么会这样:

import groovy.json.*

def js3 = new JsonBuilder(["test", "test1"])
def js4 = new JsonBuilder(js3)
println js4.toString()

打印:

{"content":["test","test1"]}

和这个:

import groovy.json.*

def js3 = new JsonBuilder(["test", "test1"])
def js4 = new JsonBuilder(js3.content)
println js4.toString()

打印这个(?):

["test","test1"]

简短的回答是 JsonBuilder 有一个名为 的成员content,它代表有效负载。当一个 JsonBuilder 吸收另一个 JsonBuilder 时,我们想要替换有效负载,而不是嵌套它。此行是替换有效负载的方法:

def js4 = new JsonBuilder(js3.content)

最终,这源于JsonBuilder.toString()此处的代码)调用JsonOutput.toJson(object)此处的代码)的事实。

读者可以尝试以下练习:

class MyBuilder {
    def content
}

def myB = new MyBuilder(content: ["test", "test1"])
println JsonOutput.toJson(myB)
println JsonOutput.toJson(myB.content)
于 2013-09-26T02:42:18.347 回答