2011-06-14 70 views
2

如何从groovy中获得执行的JavaScript代码的结果?我尝试了以下,但我总是找回字符串“世界”。我会期待一个对象或地图。如何从groovy执行Javascript代码并将结果作为地图显示?

import javax.script.ScriptEngineManager 
import javax.script.SimpleBindings 

def manager = new ScriptEngineManager() 
manager.getEngineByName("JavaScript").eval(""" 
    {hello: name} 
""", [name:'world'] as SimpleBindings) 

回答

2

简单!

您可以在对象映射到一个变量,返回......

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

+0

我接受这个,因为这比使用内部类更好。 – Blacktiger 2016-12-13 13:58:51

2

这是一个有点棘手(我能找到的唯一的解决办法是使用一个内部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] 

隐而不宣”我觉得这是一种非常干净的做事方式(如果你有一个阵列地图,可能需要一些工作)

但我能找到的最好的: -/

+0

我曾经以为从Java运行Javascript应该很容易,但我猜不是。好吧。 – Blacktiger 2011-06-15 19:12:33