GroovyからJavaScriptコードを実行し、結果をマップとして取得する方法は?

StackOverflow https://stackoverflow.com/questions/6348587

  •  27-10-2019
  •  | 
  •  

質問

Groovyから実行されたJavaScriptコードの結果を取得するにはどうすればよいですか?私は次のことを試しましたが、私はいつも文字列「世界」を取り戻します。オブジェクトまたはマップを期待していたでしょう。

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

または、aを追跡することもできます 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バージョン: 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]

物事を行う非常にきれいな方法を感じていません(たとえば、配列のマップがある場合は、おそらく何らかの作業が必要になります)

しかし、私が見つけることができる最高のもの: - /

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top