2015-07-13 101 views
2

我試圖將我的Wicket項目中的JavaScript集成到我的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陣列,使用更多的JavaScript腳本,並使用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類中有Arrays,它將不起作用。 ScriptObjectMirror中的每個列表也將是ScriptObjectMirror對象。 –