gpt4 book ai didi

json - 使用 Groovy JsonBuilder 设置委托(delegate)值

转载 作者:行者123 更新时间:2023-12-04 04:51:36 26 4
gpt4 key购买 nike

(这是对 here 提出的问题的后续问题)

我正在使用 Groovy 的 JsonBuilder 动态生成以下 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()
builder {
addUrn(delegate, "type", myCustomVal1)
addUrn(delegate, "urn", "some:urn:$myCustomVal2")
"date" {
epoch 1265662800000
str "2010-02-08T21:00:00Z"
}
"metadata" ({
ratings ({
rating "G"
scheme "eirin"
addUrn(delegate, "_type", "$myCustomVal3")
})
creators "Jim", "Bob", "Joe"
})
}

return root.toString();
}

代码抛出 StackOverflowError因为第三次调用 addUrn (在嵌套的 ratings 元素下。如果我注释掉该行,它会完美运行(除了我缺少必要的信息 block 的事实)。
  • 为什么会这样?
  • 如何将委托(delegate)设置为直接父级,例如ratings ?

  • 我试过使用 metaClass 无济于事。

    最佳答案

    这很丑陋(LOL),但会给你预期的结果:

    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(delegate, "type", myCustomVal1)
    addUrn(delegate, "urn", "some:urn:$myCustomVal2")
    "date" {
    epoch 1265662800000
    str "2010-02-08T21:00:00Z"
    }
    "metadata" ([{([
    "ratings" ([{
    rating "G"
    scheme "eirin"
    this.addUrn(delegate, "_type", "$myCustomVal3")
    }]),
    creators ("Jim", "Bob", "Joe")
    ])}])
    }

    println builder.toPrettyString()
    }

    注意:-
  • 在上一个问题中,我说委托(delegate)有
    指直系 parent 。实际上它确实指的是立即
    parent 。相反,我们必须引用脚本(其中包含addUrn方法)同时调用方法,因此使用 this调用addUrn时内部评级。或者,您可以将“评级”发送到类似于 addUrn 的方法。 .
  • 括号、链括号和方括号的使用和顺序对于您在“元数据”之后看到的内容很重要。在这里理解这将很麻烦。但唯一需要注意的是坚持使用方法调用、声明列表和使用闭包的基础知识。尝试每行缩进每个大括号,您将能够捕获潜在的魔力。 :)
  • StackOverFlow 错误的原因是方法 getEpisode无法到达方法addUrn它归脚本所有。

  • 直接在 Groovy Web Console中测试

    关于json - 使用 Groovy JsonBuilder 设置委托(delegate)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17355304/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com