我正在尝试在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
(我在上面编写的代码中使用了abc
和someNode[0]
但实际上它们是app
和cat[0]
)
此外,我使用jsonslurper
解析了请求以运行上述代码
感谢您的帮助
答案 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
节点将是一个列表。在地图中获取和设置值可以通过多种不同方式完成:
put
&直接get
方法。[]
。对于您想要实现的目标,即从变量键访问值,使用方法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"
}
}