Это немного сложно (и единственное решение, которое я могу найти, - это использовать внутренний класс 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]
Не чувствует себя очень чистым способом выполнения действий (и, вероятно, потребует некоторой работы, если у вас есть карта массивов, например)
Но лучшее, что я могу найти: - /