从java操作Javascript对象

Manipulate Javascript objects from java

本文关键字:对象 Javascript 操作 java      更新时间:2023-09-26

我已经完成了一个从Java操作JavaScript对象的程序

String buildInfoJS = "var build_info = new Object;build_info.BUILD_DISPLAY_VERSION       = 'Build 201302232300'";
ScriptEngineManager mgr = new ScriptEngineManager();
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript");
jsEngine.eval(buildInfoJS);
Object object = jsEngine.get("build_info");
System.out.println(object.getClass().getName());
if (object instanceof NativeObject  ) {
    NativeObject nObj = (NativeObject)object 
    for (Object key: nObj.getAllIds()) {
        System.out.println(key);
    }
}

现在的对象是instanceof sun.org.mozilla.javascript.internal.NativeObject,但我不能直接使用这些

有办法解决这个问题吗?

为什么不直接使用JSON和Java JSON API?或者,您也可以使用GWT (Google Web Toolkit)。

考虑通过脚本引擎对Java类型进行强制转换。

例如,以下代码将属性名称强制转换为本地Java:

  public static void main(String[] a) throws ScriptException {
    ScriptEngine engine = new ScriptEngineManager()
        .getEngineByName("JavaScript");
    Object o = engine.eval("(function(){return {foo:'Hello', bar:100};}());");
    engine.put("toInspect", o);
    engine.put("visitor", new PropertyNameVisitor());
    engine.eval("(function(obj){" +
        " var arr, prop;" +
        " arr = [];" +
        " for(prop in obj) {" +
        "  if(obj.hasOwnProperty(prop)) {" +
        "   visitor.visit(prop);" +
        "  }" +
        " }" +
        " return arr;" +
        "}(toInspect));");
  }
  public static class PropertyNameVisitor {
    public void visit(String name) {
      System.out.println(name);
    }
  }