Pergunta

Eu tenho o seguinte:

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

Como posso converter o objeto de resultado que é do tipo sun.org.mozilla.javascript.internal.NativeArray para uma matriz java correspondente? Pode Somone me mostrar um Exemplo de trabalho de código , onde isso é feito? Ele deve funcionar para String e Integer matrizes. Além disso, seria ótimo saber para onde olhar para outras conversões tipo de dados entre o motor rinoceronte e java.

Btw, eu sei desta página mas eu realmente estou procurando um amostra de código de trabalho.

Foi útil?

Solução

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

Outras dicas

Eu não tenho certeza se era o caso quando essa pergunta foi feita em primeiro lugar, mas implementos NativeArray a interface de java.util.List. Uma simples maneira de converter para uma matriz Java real é, portanto:

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

Se o Javascript está sob seu controle, você poderia fazer a transformação lá, como por este documento . Então, para adaptar o seu exemplo, algo como:

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;

Embora, se você não pode mudar o Javascript esta abordagem não vai funcionar, e você [i] vai [/ i] tem uma instância de sun.org.mozilla.javascript.internal.NativeArray como sua variável result. Em que ponto eu acho que você só precisa elenco e lidar com ele diretamente, usando quaisquer métodos pública expõe; provavelmente não é bonito, mas eu não vejo quaisquer outras opções. Em particular, eu acho que a única coisa que pode garantir ao nível Rhino bom é que ele vai ser uma instância de Scriptable (e provavelmente ScriptableObject), que não ajudá-lo a usá-lo como uma matriz.

olhares resposta de Kevin como um bom caminho a percorrer aqui (e é semelhante ao que eu estava prestes a editar em: -))

solução Geral usando JSON como dados intermediários:

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());
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top