Frage

Ich habe Folgendes:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
jsEngine.eval("function getArray() {return [1,2,3,4,5];};");
Object result = jsEngine.eval("getArray();");

Wie kann ich konvertieren Sie das Ergebnis-Objekt, das vom Typ sun.org.mozilla.javascript.intern.NativeArray auf eine entsprechende java-array?Can somone zeigen Sie mir eine arbeiten code-Beispiel wo dies geschehen ist?Es sollte Arbeit für String-und Integer-arrays.Plus, es wäre toll zu wissen, wo Sie zu suchen für andere Datentyp-Konvertierungen zwischen den rhino-engine und java.

Btw, ich weiß dieser Seite aber ich bin wirklich auf der Suche für ein funktionierendes code-Beispiel.

War es hilfreich?

Lösung

NativeArray arr = (NativeArray) result;
Object [] array = new Object[(int) arr.getLength()];
for (Object o : arr.getIds()) {
    int index = (Integer) o;
    array[index] = arr.get(index, null);
}

Andere Tipps

Ich bin mir nicht sicher, ob es der Fall, wenn diese Frage war zuerst gefragt, aber NativeArray implementiert die java.util.List Schnittstelle. Ein einfacher Weg zu einer echten Java-Array zu konvertieren ist daher:

Object[] array = ((List<?>) result).toArray();

Wenn der Javascript-Code ist unter Ihrer Kontrolle, die Sie tun könnten, die transformation dort, wie pro dieses Dokument.So passen Sie Ihr Beispiel so etwas wie:

ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
jsEngine.eval("function getArray() {return [1,2,3,4,5];};");
String convertFuncSrc =
     "function convertArray(type, arr) {"
   + "  var jArr = java.lang.reflect.Array.newInstance(type, arr.length);"
   + "  for (var i = 0; i < arr.length; i++) { "
   + "    jArr[i] = arr[i];"
   + "  }"
   + "  return jArr;"
   + "};";
jsEngine.eval(convertFuncSrc);
Object result = jsEngine.eval("convertArray(java.lang.Integer.TYPE, getArray());");
int[] javaArray = (int[])result;

Obwohl, wenn Sie können nicht ändern die Javascript-dieser Ansatz nicht funktioniert, und du [mir] [/i] haben eine Instanz von sun.org.mozilla.javascript.intern.NativeArray als Ihre result - variable.An dem Punkt denke ich, brauchen Sie nur zu werfen und deal mit es direkt mit einer beliebigen öffentlichen Methoden verfügbar macht;es ist wahrscheinlich nicht schön, aber ich sehe keine anderen Optionen.Insbesondere denke ich, das einzige, was Sie garantieren können an der schönen Rhino level ist, dass es eine Instanz von Scriptable (und wahrscheinlich ScriptableObject), die nicht helfen, verwenden Sie es als ein Array.

Kevins Antwort sieht aus wie ein guter Weg, hier zu gehen (und es ist ähnlich zu dem, was ich gerade dabei war zu Bearbeiten!:-))

Allgemeine Lösung mit JSON als Datenzwischen:

Object result = jsEngine.eval("JSON.stringify(getArray())");    
JsonReader jsonReader = Json.createReader(new StringReader(result.toString()));
JsonArray jsonArray = jsonReader.readArray();
jsonReader.close();
int[] numbers = new int[jsonArray.size()];
int index = 0;
for(JsonValue value : jsonArray){
    numbers[index++] = Integer.parseInt(value.toString());
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top