2015-07-13 1 views
2

Я пытаюсь интегрировать JavaScript в мой проект Wicket в свой набор тестов TestNG. Я решил попробовать проект Nashorn.Nashorn/Javascript ассоциативный массив к объекту Java?

Теперь, чтобы исправить результаты от nashorn. Я возвращаю ассоциативный массив из javascript и получаю ScriptObjectMirror в качестве возвращаемого типа.

ScriptEngine engine = factory.getEngineByName("nashorn"); 
String content = new String(Files.readAllBytes(Paths.get("my-funcs.js"))); 
Object result = engine.eval(content + ";" + script); 

Конечно, я могу JSON.stringify массив, используя более яваскрипт сценария, и разобрать его обратно, используя Gson или аналогичные библиотек, но есть более нативный подход к этой проблеме отображения?

+2

'ScriptObjectMirror' имеет документированный интерфейс - http://cr.openjdk.java.net/~sundar/jdk. nashorn.api/8u40/javadoc/jdk/nashorn/api/scripting/ScriptObjectMirror.html –

+0

'ScriptObjectMirror', похоже, реализует' Map '- вы можете получить доступ ко всем парам ключ/значение через это? – harmic

+0

"harmic" является правильным. ScriptObjectMirror является частью документированного интерфейса Nashorn. Официальная ссылка на сайт API - https://docs.oracle.com/javase/8/docs/jdk/api/nashorn/jdk/nashorn/api/scripting/ScriptObjectMirror.html –

ответ

0

Благодаря комментарии выше, я нашел довольно красивое решение, используя Apache Commons BeanUtils

public static class MyResult 
{ 
    private String prop1; 
    public void setProp1(String s) 
    { 
     ... 
    } 
} 

... 

public MyResult getResult(String script) 
{ 
    //ugly-but-fast-to-code unchecked cast 
    ScriptObjectMirror som = (ScriptObjectMirror) engine.eval(script);  
    MyResult myResult = new MyResult(); 
    BeanUtils.populate(myResult, som); 
    return myResult; 
} 
+0

Это не сработает, если у вас есть массив в классе MyResult , Каждый список в ScriptObjectMirror будет также объектом ScriptObjectMirror. –