我正在使用groovy.json.JsonBuilder并且在指定字段名时遇到问题,该字段名也是当前作用域中变量的名称。这有效:System.out.println(new GroovyShell().evaluate( "def builder = new groovy.json.JsonBuilder();" + "def age = 23;" + "builder.example {" + " name 'Fred';" + " 'age1' 27;" + " blah {" + " foo 'bar';" + " };" + "};" + "return builder.toPrettyString()"));并产生输出:{ "example": { "name": "Fred", "age1": 27, "blah": { "foo": "bar" } }}但这失败了(“年龄”字段由于某种原因与变量冲突):System.out.println(new GroovyShell().evaluate( "def builder = new groovy.json.JsonBuilder();" + "def age = 23;" + "builder.example {" + " name 'Fred';" + " 'age' 27;" + " blah {" + " foo 'bar';" + " };" + "};" + "return builder.toPrettyString()"));并产生异常:groovy.lang.MissingMethodException: No signature of method: java.lang.Integer.call() is applicable for argument types: (Integer) values: [27]Possible solutions: wait(), abs(), any(), wait(long), wait(long, int), max(int, int) at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:72) at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:48) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128) at Script1$_run_closure1.doCall(Script1.groovy:5) at Script1$_run_closure1.doCall(Script1.groovy) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)我不想更改变量的名称。有没有办法强制 JsonBuilder 接受字段名称?正如你所看到的,我试图把它放在引号中,但这没有帮助。
1 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
使用delegate.age以指周围封闭的,而不是指的是可变的。
System.out.println(new GroovyShell().evaluate(
"def builder = new groovy.json.JsonBuilder();"
+ "def age = 23;"
+ "builder.example {"
+ " name 'Fred';"
+ " delegate.age 27;"
+ " blah {"
+ " foo 'bar';"
+ " };"
+ "};"
+ "return builder.toPrettyString()"));
应该给你
{
"example": {
"name": "Fred",
"age": 27,
"blah": {
"foo": "bar"
}
}
}
添加回答
举报
0/150
提交
取消