简体   繁体   中英

Executing Groovy script from JSON

If I want to send multiline string in JSON using curl the only way is to concatenate string using spaces. So this is working. But what to do if I send groovy script which will be run? Like in content property:

{
  "name": "helloWorld",
  "content": "repository.createDockerHosted('docker_private', 8082_1, null) repository.createDockerHosted('docker_private_2', 8082, null)",
  "type": "groovy"
}

Is it possible to inform groovy compiler that there are two instructions? Maybe by adding some special character to content value?

Thanks for help :)

To execute a string as Groovy script, the standard pattern is to use GroovyShell with a Binding :

class Repository {
    def createDockerHosted(a, b, c) {
        println "TRACER createDockerHosted $a $b $c"
    }
}

def content = "repository.createDockerHosted('docker_private', 8082_1, null) ; repository.createDockerHosted('docker_private_2', 8082, null)"

def binding = new Binding()
binding.setProperty('repository', new Repository())
def shell = new GroovyShell(binding)
shell.evaluate(content)

(Note in the above that content has ; to separate the two statements) Output:

$ groovy Example.groovy 

TRACER createDockerHosted docker_private 80821 null
TRACER createDockerHosted docker_private_2 8082 null

So for your situation (if I understand it), the only issue is how to extract content from JSON:

def jsonStr = '''
{
  "name": "helloWorld",
  "content": "repository.createDockerHosted('docker_private', 8082_1, null) ; repository.createDockerHosted('docker_private_2', 8082, null)",
  "type": "groovy"
}
'''

def jsonMap = new groovy.json.JsonSlurper().parseText(jsonStr)
def content = jsonMap['content']

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM