Question

J'ai les informations suivantes:

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

Comment puis-je convertir l'objet de résultat de type sun.org.mozilla.javascript.internal.NativeArray en un tableau java correspondant? Quelqu'un peut-il me montrer un exemple de code de travail à cet endroit? Cela devrait fonctionner pour les tableaux String et Integer. De plus, il serait bon de savoir où chercher d'autres conversions de types de données entre le moteur rhino et java.

Btw, Je connais cette page , mais je suis vraiment à la recherche d'un exemple de code de travail.

Était-ce utile?

La solution

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);
}

Autres conseils

Je ne suis pas sûr que ce soit le cas lorsque cette question a été posée pour la première fois, mais NativeArray implémente l'interface java.util.List . Un moyen simple de convertir en tableau Java réel est donc:

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

Si le Javascript est sous votre contrôle, vous pouvez y effectuer la transformation, comme indiqué dans ce document . Donc, pour adapter votre exemple, quelque chose comme:

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;

Bien que, si vous ne pouvez pas changer le Javascript, cette approche ne fonctionnera pas, et vous [i] aurez [/ i] une instance de sun.org.mozilla.javascript.internal.NativeArray comme résultat variable. À ce stade, je pense que vous avez juste besoin de le traiter et de le traiter directement, en utilisant les méthodes publiques qu’il expose; ce n'est probablement pas joli mais je ne vois aucune autre option. En particulier, je pense que la seule chose que vous puissiez garantir au niveau gentil de Rhino, c'est que ce sera une instance de Scriptable (et probablement de ScriptableObject ), ce qui ne vous aide pas. utilisez-le comme un tableau.

La réponse de Kevin semble comme un bon moyen d’aller ici (et est similaire à ce que j’étais sur le point de modifier!: -))

Solution générale utilisant JSON comme intermédiaire de données:

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());
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top