如何从Groovy中执行Javascript代码并以地图的形式获得结果?

问题描述

| 如何从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]
感觉不是很干净的处理方式(例如,如果您有数组映射,则可能需要做一些工作) 但是我能找到的最好的是:-/