在Java中可以访问的Java解析

时间:2017-05-15 21:04:08

标签: java nashorn

我有

public JSONObject parseXML(String xml) {
    JSONObject jsonObject = XML.toJSONObject(xml);
    return jsonObject;
}
来自org.json库的

在Nashorn,我希望能够做到

let foo = parseXML(someXMLString);
console.log(foo.someProperty);

我最终获得的是NPE。但是如果我做的话

let foo = parseXML(someXMLString);
console.log(JSON.parse(foo.someProperty));

它有效。是否有一个与JSON.parse相同的函数我可以在Java land中执行并返回而不需要JavaScript中的JSON.parse?

编辑:请注意它不是重复的。我不是在问如何解析JSON中的某些值,我问的是如何返回整个对象,以便Nashorn可以解析它而不需要额外的JSON.parse

1 个答案:

答案 0 :(得分:1)

您可以从Java调用JSON.parse或任何其他脚本函数。从Java调用JSON.parse的示例代码:

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import jdk.nashorn.api.scripting.JSObject;

public class Main {
    public static void main(String[] args) throws Exception {
        ScriptEngineManager m = new ScriptEngineManager();
        ScriptEngine e = m.getEngineByName("nashorn");

        // get ECMAScript JSON.parse
        JSObject jsonParse = (JSObject)e.eval("JSON.parse");

        // initialize/retrieve JSON string here
        String str = "{ \"foo\": 42, \"bar\": { \"x\": \"hello\" } }";

        // call JSON.parse from Java
        Object parsed = jsonParse.call(null, str);

        // expose parsed object to script
        e.put("obj", parsed);

        // access parsed object from script
        e.eval("print(obj.foo)");
        e.eval("print(obj.bar.x)");
    }
}