Выполнение кода переменной в Groovyshell

Рассмотрим этот фрагмент кода

 def RespJson = RespSlurper.parseText(content)    
 def RespNode= "RespJson"+"."+ assertionKey

где assertionKey будет динамически изменяться на каждой итерации и будет иметь такие значения, как seatbid[0].bid[0].impid

Как я могу выполнить приведенный ниже код в Groovyshell, я пытаюсь это сделать

def v    
def a = new Binding(RespJson: RespJson)
new GroovyShell(a).evaluate(" v=${RespNode}")
log.info(v)

Но я получил значение v как null . Любая помощь приветствуется. Спасибо.

ИЗМЕНИТЬ:

def RespSlurper = new JsonSlurper()
def content = step.testRequest.response.responseContent

и значение content равно

{  
   "seatbid":[  
      {  
         "bid":[  
            {  
               "id":"1",
               "impid":"1",
               "price":3.5999999046325684,
               "nurl":"http:...",
               "adomain":[  
                  "zagg.com",
                  "zagg.com"
               ],
               "iurl":"http:...",
               "crid":"30364.s320x50m",
               "h":0,
               "w":0
            }
         ],
         "group":0
      }
   ],
   "cur":"USD",
   "nbr":0
}

person user1207289    schedule 21.01.2015    source источник
comment
Не могли бы вы предоставить полный пример, который можно протестировать в groovyshell? Здесь есть неизвестные фрагменты (например, RespSlurper, content). Спасибо.   -  person mnd    schedule 21.01.2015
comment
в качестве альтернативы просто возвращаемому значению будет def data=[a:[1,2,3]]; assert 3==Eval.x(data, "x.a[2]"). но я думаю, что путь RespNode просто дает null в результате.   -  person cfrick    schedule 21.01.2015
comment
@mnd Спасибо за ваш ответ. Я отредактировал вопрос с ответами.   -  person user1207289    schedule 21.01.2015


Ответы (1)


У меня есть код ниже, который я считаю сокращенной версией того, что задает вопрос.

В этом случае кажется, что переменная v может быть извлечена из привязки, то есть a. Переменные привязки доступны в объекте variables.

Кроме того, поскольку скрипт, оцениваемый GroovyShell, совпадает с тем, что установлено для v, при печати вывода объекта GroovyShell также будет напечатано «1».

import groovy.json.JsonSlurper

def RespSlurper = new JsonSlurper()
def content = '{"seatbid":[{"bid":[{"id":"1","impid":"1","price":3.5999999046325684,"nurl":"http:...","adomain":["zagg.com","zagg.com"],"iurl":"http:...","crid":"30364.s320x50m","h":0,"w":0}],"group":0}],"cur":"USD","nbr":0}'
def RespJson = RespSlurper.parseText(content)
def assertionKey = "seatbid[0].bid[0].impid"
def RespNode= "RespJson"+"."+ assertionKey
def v
def a = new Binding(RespJson: RespJson)
def result = new GroovyShell(a).evaluate("v=${RespNode}")
println(v)
// Important addition!
println(result)         <=== print the value of the GroovyShell, it will show "1"
println(a.variables.v)  <=== retrieve the "v" variable off of the binding, it will show "1"
person mnd    schedule 21.01.2015
comment
Спасибо. Это сработало. Не понял, что правильный результат находится в result . Дополнительно я научился работать с объектом variables. в Groovyshell . - person user1207289; 22.01.2015