在 Java 中解析 在 Java 中可访问

Parse in Java accessible in Java

我有

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));

有效。我可以在 Java land 和 return 中执行与 JSON.parse 等效的功能,而无需 JavaScript 中的 JSON.parse 吗?

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

您可以从 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)");
    }
}