在groovy中动态执行代码

时间:2014-09-26 13:37:16

标签: grails groovy

我正在尝试在groovy中动态运行代码。我在变量someNode[0]

中有var1,这是值

然后我像这样添加双引号

var2 = "\""+var1+"\""

然后我试着运行这个

request.abc."$var2"=Value

我看到here可以在属性和方法上完成这类事情。但上面的代码不起作用。给我错误

An error occurred [Cannot set property '"someNode[0]"' on null object], see error log for details

感谢任何帮助。感谢。

修改 这是我的请求的片段

{
   "app":{
      "bundle":"531323947",
      "cat":[
         "IAB1",
         "IAB9",
         "IAB9-30",
         "entertainment",
         "games"
      ],
      "id":"agltb3B1Yi1pbmNyDAsSA0FwcBitsL4UDA",
      .
      .

我想要操作的字段为cat[0]IAB1(我在上面编写的代码中使用了abcsomeNode[0]但实际上它们是appcat[0]

此外,我使用jsonslurper解析了请求以运行上述代码

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

执行此操作的一种方法是Eval

def request =[
"app":[
    "bundle":"531323947",
    "cat":[
            "IAB1",
            "IAB9",
            "IAB9-30",
            "entertainment",
            "games"
    ],
]
]

assert request.app.cat[0]=='IAB1'
def var = 'request.app.cat[0]'
Eval.me('request', request, "$var = 'new value'")
assert request.app.cat[0]=='new value'

答案 1 :(得分:1)

您正在访问/更新地图和列表中的值。 request.app节点将是一个映射,request.app.cat节点将是一个列表。在地图中获取和设置值可以通过多种不同方式完成:

  1. 使用put&直接get方法。
  2. 使用方括号[]
  3. 使用缺少的属性作为地图键(即您使用它的方式)。
  4. 对于您想要实现的目标,即从变量键访问值,使用方法1或2代替方法3以及GString内的变量要容易得多。

    使用括号的示例:

    import groovy.json.JsonBuilder
    import groovy.json.JsonSlurper
    
    def request = new JsonSlurper().parseText '''{
            "app":{
                "bundle":"531323947",
                "cat":[
                    "IAB1",
                    "IAB9",
                    "IAB9-30",
                    "entertainment",
                    "games"
                ],
                "id":"agltb3B1Yi1pbmNyDAsSA0FwcBitsL4UDA"
            }
        }'''
    
    def level0 = 'app'
    def level1 = 'cat'
    
    def node = request[level0][level1]
    
    assert request instanceof Map
    assert node instanceof List
    assert node[0] == 'IAB1'
    
    node[0] = 'new value'
    assert node[0] == 'new value'
    
    println new JsonBuilder(request).toPrettyString()
    

    输出:

    {
        "app": {
            "cat": [
                "new value",
                "IAB9",
                "IAB9-30",
                "entertainment",
                "games"
            ],
            "id": "agltb3B1Yi1pbmNyDAsSA0FwcBitsL4UDA",
            "bundle": "531323947"
        }
    }