获取javascript对象的字段值

时间:2014-03-31 11:06:33

标签: java rhino scriptengine

我一直在使用rhino来允许自定义某些应用程序。以下是从Java调用的JavaScript函数示例:

        function() {
            var phone = this.telephoneNumber;
            phone = phone.replace(/[^+0-9]/g,"");
            if (phone.indexOf("+") == 0) {
                phone = "00" + phone.substring(1);
            }
            if (phone.indexOf("0041") == 0) {
                phone = "0" + phone.substring(4);
            }
            if (phone.indexOf("0") == 0) {
                phone = "0" + phone;
            }
            return {
                Name: this.sn + " " + this.givenName,
                firstName: this.givenName || "",
                lastName: this.sn || "",
                phone: phone,
                service: "",
                info: ""
            };
        }

然后,java应用程序可以获取返回对象的值,无论它需要做什么。

既然rhino是JVM的一部分,我想使用脚本API而不是Rhino API,但我还没有找到如何从Java代码中获取JavaScript对象的字段值。

1 个答案:

答案 0 :(得分:1)

这松散地结合了脚本语言,但需要注意函数的注意事项,返回的对象需要是Map(Rhino就是这样,但我不确定JRuby)。

    ScriptEngineManager factory = new ScriptEngineManager();
    ScriptEngine engine = factory.getEngineByName("JavaScript");
    engine.eval("function x() { return { foo: 10 } }");

    Object o = ((Invocable)engine).invokeFunction("x");
    if (o instanceof Map) {
    Map m = (Map<Object, Object>)o;
        System.out.println(m.get("foo"));
    }

    CompiledScript script = ((Compilable)engine).compile("(function() { return {bar:20} })()");
    System.err.println(((Map)script.eval()).get("bar"));

但是你必须通过用(...)()填充它来欺骗并调用你的函数。