2016-03-24 6 views
2

Я пытаюсь использовать javax.script.ScriptEngine для eval() некоторых скриптов JS. Как узнать, был ли результат после eval(), который имеет тип Object, представляет собой массив? И если да, то как я могу его бросить?Получить массив в результате ScriptEngine.eval()

Прямо сейчас, чтобы узнать, имеет ли объект тип Number или тип String, я использую instanceof. И когда результатом скрипта является массив, если я печатаю с System.out.println(), возвращаемый объект просто печатает [object Array].

ответ

1

Как узнать, был ли результат после eval(), который имеет тип Object, представляет собой массив?

Использование instanceof:

if(result instanceof Object[]){ 
    //your code 
} 

И если да, то как я могу бросить его?

if(result instanceof Object[]){ 
    Object[] array = (Object[])result; 
    for(Object o : array) { 
    //your code 
    } 
}  
+0

Это не сработало. 'Instanceof' в выражении if возвращает false. – mcmacker4

2

Как вы заметили, это не ява массив, но 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

В моем случае изменения сценария, чтобы заставить его вернуться список делает трюк:

private String arrayToList() { 
    if (javascript.startsWith("[") && javascript.endsWith("]")) 
     javascript = "java.util.Arrays.asList(" + javascript + ")"; 
    return javascript; 
} 

Но, конечно, он обрабатывает только случай, когда результаты массива от использования скобок, например:

["entry1", "entry2", settings.getMainUserEmail(), loginEmail] 

В любом случае суть в том, что вам нужно вернуть List вместо массива. Затем вы также можете использовать instanceof.

Смежные вопросы