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