Groovy JSONBuilder问题

Groovy JSONBuilder问题,json,groovy,Json,Groovy,我正在尝试将JsonBuilder与Groovy结合使用来动态生成JSON。我想创建一个JSON块,如: { "type": { "__type": "urn", "value": "myCustomValue1" }, "urn": { "__type": "urn", "value": "myCustomValue2" }, "date": { "epoch": 12656

我正在尝试将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();
}
但我遇到了以下问题:

  • 无论何时调用
    addUrn
    ,字符串中都不会返回任何内容我是否误解了如何在Groovy中使用方法?
  • 没有一个值封装在返回字符串的双引号(或单引号)中
  • 每当我使用
    {
    ,我都会在返回值中得到一个“\u geteposion\u closure2\u closure2@(插入十六进制)”
  • 我的语法有问题吗?或者有人能给我指出一些使用简单值以外的方法和/或示例(例如数组中的嵌套值)的示例/教程吗

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

  • 您必须在
    addUrn
    方法中使用
    delegate
    ,而不是 传递您正在使用的
    生成器

  • 这是因为您正在
    root
    上执行
    toSting()
    toPrettyString()
    而不是
    builder

  • 如果遵循#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"
        }
    }
    

    是的,
    委托
    起到了作用。但是,当我使用builder.toString()时,我得到了一个StackOverflowerError(ReflectiveOperationException)。@Devin你在使用什么脚本?你从我的示例代码中得到了异常吗?@Devin看看你是否在谈论嵌套对象。通过注释我的嵌套类型(在本例中为“元数据”),它运行得非常好。我将查看该链接,看看我能学到什么。谢谢!@Devin只需在
    metadata
    内部注释
    addUrn
    ,一切都会正常工作。需要注意三件事:1.
    delegate
    必须设置为直接父级。在这种情况下,
    delagate
    必须是
    ratings
    when您调用addUrn inside ratings.2.您将无法获得
    元数据和
    ratings的json数组。使用您现在的实现,它将是普通的json对象。必须使用
    。收集
    ,希望获得一个列表转换为json数组。3.最后,看看如何使用JsonBuilder来代替JsonBuilder。