JavaのJavascript配列をJava配列に変換しようとしています。私はjavax.scriptパッケージを使用しています。 ここでこの例をテストしましたが、タイプ "NativeArray"が認識されませんでした:https://stackoverflow.com/a/1433489/975097Javascript配列をJava配列に変換する
NativeArrayタイプを認識させるにはどうしたらいいですか?
JavaのJavascript配列をJava配列に変換しようとしています。私はjavax.scriptパッケージを使用しています。 ここでこの例をテストしましたが、タイプ "NativeArray"が認識されませんでした:https://stackoverflow.com/a/1433489/975097Javascript配列をJava配列に変換する
NativeArrayタイプを認識させるにはどうしたらいいですか?
this answerJava array using Rhino's Java binding functionalityにネイティブJavaScript配列を変換するJavaScriptコンバーター関数を記述するのが最善の方法です。個々の要素を変換するときは、適切な型を使用するように注意しなければならないことに注意してください。
ScriptEngine js = new ScriptEngineManager().getEngineByName("JavaScript");
String ss[] = (String[]) js.eval(
"(function() {" +
" var a = java.lang.reflect.Array.newInstance(java.lang.String, 3);" +
" a[0] = 'foo';" +
" a[1] = 'bar';" +
" a[2] = 'gah';" +
" return a;" +
"})()");
System.out.println(Arrays.toString(ss)); // => [foo, bar, gah]
スレッド "main"の例外javax.script.ScriptException:sun.org.mozilla.javascript.EvaluatorException:メソッドjava.lang.reflect.Array.newInstance(string、number)が見つかりません。 (Unknown source>#120)を行番号120で入力してください。 \t com.sun.script.javascript.RhinoScriptEngine.invoke(RhinoScriptEngine.java:255) \t com.sun.script.javascript.RhinoScriptEngine .invokeFunction(RhinoScriptEngine.java:213) \t JavascriptInJava.main(JavascriptInJava.java:75) –
この行を追加したときに上記のエラーが発生しました。var jArr = java.lang.reflect.Array.newInstance(String、sortedParms .length); where sortedParms.lengthは配列の長さです。メソッドが定義されていないように見えますが、たとえリンクで指定された例で動作するはずです。このための回避策はありますか? –
@AndersonGreen:私の更新された答えに従って、 'java.lang.String'引数を使ってみてください。 – maerics
Doug Crockfords JSON-java libraryをお勧めします。これにより、jsonをネイティブJAVAオブジェクトに変換することができます。
私は単純に、JSON-libが使用して配列をそのように解析します:
[編集]はここで文字列配列を使用して作業例です。例えば How to parse a JSON and turn its values into an Array?
Rhinoは、この提供しています参照してください。
https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Embedding_tutorial#usingJSObjs
また、スクリプト可能なインタフェースは、(()を取得できますし、設定を)ので、簡単にオブジェクトのプロパティを列挙し、配列に追加することができました:それはRhinoの特定のもののように見えるので、NativeArrayを使用して
Scriptable arr = (Scriptable) result;
Object [] array = new Object[arr.getIds().length];
for (Object o : arr.getIds()) {
int index = (Integer) o;
array[index] = arr.get(index, null);
}
同じことはありません。あなたは簡単にブレークポイントを落として、あなたが与えられたオブジェクトのタイプを見てそれにダウンキャストすることができます。これは、NativeArrayにかなり近いJS Array実装のようなものです。
他の質問の「NativeArray」クラスはRhinoのものなので、ScriptEngineメカニズムを使用している場合は、使用可能とは思われません(少なくとも「クリーン」な方法ではない)。 – Pointy
... err、 'sun.org.mozilla.javascript.internal.NativeArray' – Pointy
アクセス制限:必要なライブラリ/ usr/lib/jvm/java-6-openjdkの制限により、NativeArray型にアクセスできません/jre/lib/rhino.jar –