2016-03-24 11 views
2

javax.script.ScriptEngineをeval()のJSスクリプトに使用しようとしています。 タイプObjectであるeval()の後の結果が配列であるかどうかをどのように知ることができますか?もしそうなら、どうすればキャストできますか?ScriptEngine.eval()の結果として配列を取得する

現在、オブジェクトの型がNumber型かString型かどうかを確認するには、instanceofを使用します。そして、スクリプトの結果が配列の場合、System.out.println()でオブジェクトを返すと、返されたオブジェクトは単に[object Array]と表示されます。

答えて

1

Object型のeval()の後の結果が配列であるかどうかをどのように知ることができますか?

使用instanceof

if(result instanceof Object[]){ 
    //your code 
} 

もしそうなら、どのように私はそれをキャストすることができますか?

if(result instanceof Object[]){ 
    Object[] array = (Object[])result; 
    for(Object o : array) { 
    //your code 
    } 
}  
+0

これは機能しませんでした。 if文の 'instanceof'はfalseを返します。 – mcmacker4

2

あなたが気づいたとして、それはあなたが戻りオブジェクトのクラスを印刷する場合、あなたはおそらくそれが「ScriptObjectMirror」だでしょう、Javaの配列が、javascript配列ではありません。私はあなたの別のスクリプト変数に配列をtoStringし、次にその値を取得するための回避策があります(下記の例を参照)。この配列の問題を解決する良い方法があると私は信じています。私の場合は

engine.eval("var fruits = [\"Banana\", \"Orange\", \"Apple\", \"Mango\"]; var d = fruits.toString();"); 
System.out.println(engine.get("fruits").getClass()); 
System.out.println(engine.get("d").getClass()); 
System.out.println(engine.get("d")); 
1

それはリストを返す作るためにスクリプトを修正するトリックを行います。

private String arrayToList() { 
    if (javascript.startsWith("[") && javascript.endsWith("]")) 
     javascript = "java.util.Arrays.asList(" + javascript + ")"; 
    return javascript; 
} 

しかし、もちろん、それは例えば、ブラケットを使用してから配列の結果のみケースハンドル:

["entry1", "entry2", settings.getMainUserEmail(), loginEmail] 

とにかく、配列の代わりにListを返す必要があります。その後、instanceofを使用することもできます。

関連する問題