问题描述
|
如何从groovy中获取执行的javascript代码的结果?我尝试了以下操作,但是我总是找回字符串“ world”。我本来希望有一个对象或地图。
import javax.script.ScriptEngineManager
import javax.script.SimpleBindings
def manager = new ScriptEngineManager()
manager.getEngineByName(\"JavaScript\").eval(\"\"\"
{hello: name}
\"\"\",[name:\'world\'] as SimpleBindings)
解决方法
简单!
您可以将对象映射到变量,然后返回...
import javax.script.*
def bindings = [name:\'world\']
def response = new ScriptEngineManager()
.getEngineByName(\'javascript\')
.eval(\"var r = {hello:name}; r;\",bindings as SimpleBindings)
println response.hello // -> world
或者,您可以跟踪response
Map对象,并对其进行更新...
import javax.script.*
def bindings = [name:\'world\',response:[:]]
new ScriptEngineManager()
.getEngineByName(\'javascript\')
.eval(\"var r = {hello:name}; response.data = r;\",bindings as SimpleBindings)
println bindings.response.data.hello // -> world
Groovy版本:2.4.5
Java版本:1.8.0_60
, 这有点棘手(我唯一能找到的解决方案是使用内部的sun.com
类):-/
import javax.script.ScriptEngineManager
import javax.script.SimpleBindings
import sun.org.mozilla.javascript.internal.NativeObject
// A Category to parse NativeObject into a Map
class NativeObjectParser {
static Map asMap( NativeObject jsobj ) {
jsobj.allIds.inject( [:] ) { map,key ->
def value = jsobj.get( key,jsobj )
// Handle nested maps
map << [ (key):value instanceof NativeObject ? value.asMap() : value ]
}
}
}
// Your code as you had it before (apart from the JS defines a var,and returns that var object)
def manager = new ScriptEngineManager()
def ret = manager.getEngineByName(\"JavaScript\").eval(\"\"\"
var r = { \'hello\': name }
r
\"\"\",[ name:\'world\' ] as SimpleBindings )
// Do the unwrapping
def map = use( NativeObjectParser ) {
ret.asMap()
}
println map
打印出来:
[hello:world]
感觉不是很干净的处理方式(例如,如果您有数组映射,则可能需要做一些工作)
但是我能找到的最好的是:-/