3

我正在尝试将 JsonBuilder 与 Groovy 一起使用来动态生成 JSON。我想创建一个 JSON 块,如:

{
    "type": {
        "__type": "urn",
        "value": "myCustomValue1"
    },
    "urn": {
        "__type": "urn",
        "value": "myCustomValue2"
    },
    "date": {
        "epoch": 1265662800000,
        "str": "2010-02-08T21:00:00Z"
    },
    "metadata": [{
        "ratings": [{
            "rating": "NR",
            "scheme": "eirin",
            "_type": {
                "__type": "urn",
                "value": "myCustomValue3"
            }
        }],
        "creators": [Jim, Bob, Joe]
    }]
}

我写过:

def addUrn(parent, type, urnVal) {
    parent."$type" {
        __type "urn"
        "value" urnVal
    }
}

String getEpisode(String myCustomVal1, String myCustomVal2, String myCustomVal3) {
    def builder = new groovy.json.JsonBuilder()
    def root = builder {
        addUrn(builder, "type", myCustomVal1)
        addUrn(builder, "urn", "some:urn:$myCustomVal2")
        "date" {
            epoch 1265662800000
            str "2010-02-08T21:00:00Z"
        }
       "metadata" ({
                ratings ({
                        rating "G"
                        scheme "eirin"
                        addUrn(builder, "_type", "$myCustomVal3")
                })
                creators "Jim", "Bob", "Joe"                    
        })
    }

    return root.toString();
}

但是我遇到了以下问题:

  1. 每当我调用addUrn时,字符串中都不会返回任何内容。 我是否误解了如何在 Groovy 中使用方法?
  2. 在返回的字符串中,没有任何值被封装在双(或单)引号中。
  3. 每当我使用 a{时,我都会在返回值中得到一个 '_getEpisode_closure2_closure2@(insert hex)'。

我的语法有问题吗?或者有人可以指出一些示例/教程,这些示例/教程使用简单值之外的方法和/或示例(例如数组中的嵌套值)。

注意:这是一个淡化的示例,但我试图保持给我带来问题的区域的复杂性。

4

1 回答 1

2
  1. 您必须使用delegateinaddUrn方法而不是传递builder您正在工作的方法。

  2. 这是因为您正在执行 a toSting()or toPrettyString()onroot而不是builder.

  3. 如果遵循#2,则已解决。

样本:

def builder = new groovy.json.JsonBuilder()
def root = builder {
              name "Devin"
              data {
                 type "Test"
                 note "Dummy"
              }
              addUrn(delegate, "gender", "male")
              addUrn(delegate, "zip", "43230")
           }


def addUrn(parent, type, urnVal) {
    parent."$type" {
        __type "urn"
        "value" urnVal
    }
}

println builder.toPrettyString()

输出:-

{
    "name": "Devin",
    "data": {
        "type": "Test",
        "note": "Dummy"
    },
    "gender": {
        "__type": "urn",
        "value": "male"
    },
    "zip": {
        "__type": "urn",
        "value": "43230"
    }
}
于 2013-06-27T20:05:32.510 回答