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

时间:2009-09-16 14:36:55

标签: java scripting rhino jsr223

我有以下内容:

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之间的其他数据类型转换会很棒。

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

5 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:9)

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

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

答案 2 :(得分:8)

如果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的实例作为你的{{1变量。在这一点上,我认为你只需要使用它暴露的任何公共方法直接投射和处理它;它可能不漂亮,但我没有看到任何其他选择。特别是我认为你唯一可以保证在Rhino级别上保证它是result(可能是Scriptable)的一个实例,它无法帮助你将它用作数组。

Kevin's answer看起来像是一个很好的方式来到这里(和我刚刚编辑的内容相似!: - ))

答案 3 :(得分: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());
}

答案 4 :(得分:0)

就我而言,我想在脚本中生成一个Java数组。 (该用例也符合问题。)

Creating Java Arrays之后,我想到了

var javaArray = java.lang.reflect.Array.newInstance(java.lang.Integer, jsArray.length);
for (var i = 0; i < javaArray.length; i++) {
  javaArray[i] = new java.lang.Integer(jsArray[i]);
}