我正在尝试将javax.script.ScriptEngine用于eval()
一些JS脚本。
如何知道类型为eval()
的{{1}}之后的结果是否为数组?如果是这样,我该如何施展呢?
现在,要知道对象是Number类型还是String类型,我使用Object
。当脚本的结果是数组时,如果我使用instanceof
打印返回的对象,则只打印System.out.println()
。
答案 0 :(得分:2)
正如您所注意到的,它不是java数组而是javascript数组,如果您打印返回对象的类,您可能会发现它" ScriptObjectMirror"。我有一个解决方法,即在另一个脚本变量中调用数组,然后获取它的值(参见下面的例子)。我相信有更好的方法来解决这个阵列问题,等待好的答案。
engine.eval("var fruits = [\"Banana\", \"Orange\", \"Apple\", \"Mango\"]; var d = fruits.toString();");
System.out.println(engine.get("fruits").getClass());
System.out.println(engine.get("d").getClass());
System.out.println(engine.get("d"));
答案 1 :(得分:1)
如何知道在Object类型的eval()之后的结果是否为数组?
使用instanceof
:
if(result instanceof Object[]){
//your code
}
如果是的话,我该如何施展呢?
if(result instanceof Object[]){
Object[] array = (Object[])result;
for(Object o : array) {
//your code
}
}
答案 2 :(得分:1)
在我的情况下,修改脚本使其返回列表可以解决问题:
private String arrayToList() {
if (javascript.startsWith("[") && javascript.endsWith("]"))
javascript = "java.util.Arrays.asList(" + javascript + ")";
return javascript;
}
但当然它只处理使用括号产生数组的情况,例如:
["entry1", "entry2", settings.getMainUserEmail(), loginEmail]
无论如何,底线是您需要返回List
而不是数组。然后您还可以使用instanceof
。