Как выполнить код JavaScript от Groovy и получить результаты в качестве карты?
-
27-10-2019 - |
Вопрос
Как я могу получить результаты выполненного кода JavaScript от Groovy? Я попробовал следующее, но я всегда возвращаю строку «мир». Я бы ожидал объекта или карты.
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
Карта объекта и обновите это ...
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 Version: 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]
Не чувствует себя очень чистым способом делать вещи (и, вероятно, потребует некоторой работы, если у вас есть карта массивов), например)
Но лучшее, что я могу найти:-/
Не связан с StackOverflow