-->

如何转换的Rhino JavaScript数组到Java的数组(How to convert Rhi

2019-07-18 05:30发布

我有以下几点:

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告诉我一个工作代码示例 ,其中做到这一点? 它应该工作的字符串和整数数组。 此外,这将是伟大知道到哪里寻找犀牛引擎和Java之间的其它数据类型转换。

顺便说一句, 我知道这个页面 ,但我真的很想找一个工作代码示例。

Answer 1:

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


Answer 2:

我不知道这是否是第一次时,有人问这个问题的话,但NativeArray实现java.util.List接口。 因此,要转换为真正的Java数组的简单方法是:

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


Answer 3:

如果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]于具有sun.org.mozilla.javascript.internal.NativeArray的实例作为result的变量。 在这一点,我认为你只需要直接投和处理它,使用它暴露任何公共方法; 它可能不漂亮,但我看不出有任何其他选项。 特别是我认为你可以在漂亮的犀牛水平保证的唯一事情是,这将是一个实例Scriptable (也可能是ScriptableObject ),这不利于你使用它作为一个数组。

凯文的答案看起来像一个很好的方式去这里(和类似什么,我正要在编辑!:-))



Answer 4:

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


文章来源: How to convert Rhino-JavaScript arrays to Java-Arrays