为了账号安全,请及时绑定邮箱和手机立即绑定

Groovy JsonBuilder:也使用作为变量名的字段名

Groovy JsonBuilder:也使用作为变量名的字段名

当年话下 2021-11-17 15:14:03
我正在使用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"

        }

    }

}


查看完整回答
反对 回复 2021-11-17
  • 1 回答
  • 0 关注
  • 163 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信