2009-09-16 26 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()); 
} 
相關問題