2009-09-16 27 views
17

我有以下几点:如何的Rhino JavaScript数组转换为Java的数组

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数组? somone可以告诉我一个工作代码示例在哪里完成?它应该适用于String和Integer数组。另外,知道在哪里寻找其他数据类型转换在rhino引擎和java之间将是非常好的。

Btw,i know this page但我真的在寻找一个有效的代码示例。

回答

22
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); 
} 
+0

感谢帮助一个愚蠢的家伙;-)我希望所有的答案将是精确,简短和工作! – Chris 2009-09-16 14:54:35

+0

不知道为什么,但不能将整个getIds数组转换为Integer []。我得到一个ClassCastException。哦,以及 – TheLQ 2010-07-04 07:51:12

7

如果Javascript受你控制,你可以按照this document进行转换。因此,要适应你的榜样,是这样的:

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变量。在这一点上,我认为你只需要使用任何公开的方法直接进行投射和处理;这可能不太好,但我没有看到其他选择。特别是我认为在犀牛级别上唯一可以保证的是它将是Scriptable(也可能是ScriptableObject)的一个实例,它不会帮助您将其用作数组。

Kevin's answer看起来像一个很好的方式去这里(和类似什么,我正要在编辑!:-))

8

我不知道这是否是这个情况时,问题首先被问到,但NativeArray实现了java.util.List接口。因此,要转换为真正的Java数组的简单方法是:

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

jdk1.6.0_45说sun.org.mozilla.javascript.internal.NativeArray不能转换为java.util.List – pal 2014-07-06 20:43:25

+0

@pal NativeArray绝对实现了在更新版本的Rhino中的List,但我不确定何时首先是这种情况。见[这里](http://javadox.com/org.mozilla/rhino/1.7R3/org/mozilla/javascript/NativeArray.html)。 – 2014-07-07 15:14:15

+1

顺便说一句,Nashorn(Java 8附带的JavaScript引擎)不幸返回实现Map而不是List的类(ScriptObjectMirror)的对象。如果你希望你的代码在Java 7和8+下工作,你必须做一个instanceof检查。 – 2014-08-21 13:58:06

0

使用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()); 
} 
相关问题