如何将Rhino-JavaScript数组转换为Java-Arrays

我有以下内容:

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

如何将sun.org.mozilla.javascript.internal.NativeArray类型的结果对象转换为相应的java数组? 可以告诉我一个有效的代码示例吗? 它应该适用于String和Integer数组。 另外,知道在哪里查找rhino引擎和java之间的其他数据类型转换会很棒。

顺便说一句, 我知道这个页面,但我真的在寻找一个有效的代码示例。

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

我不确定在第一次提出这个问题时是否就是这种情况,但NativeArray实现了java.util.List接口。 因此,转换为真实Java数组的简单方法是:

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

如果Javascript在您的控制之下,您可以根据此文档在那里进行转换。 所以为了适应你的例子,例如:

 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; 

虽然,如果你不能改变Javascript这种方法将无法工作,你[i]将[/ i]有一个sun.org.mozilla.javascript.internal.NativeArray实例作为你的result变量。 在这一点上,我认为你只需要使用它暴露的任何公共方法直接投射和处理它; 它可能不漂亮,但我没有看到任何其他选择。 特别是我认为你唯一可以保证好的Rhino级别是它将是Scriptable一个实例(可能是ScriptableObject ),它无法帮助你将它用作数组。

凯文的回答看起来像是一个很好的方式去(这和我刚要编辑的内容类似!:-))

使用JASON作为数据中间体的一般解决方案:

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