【问题标题】:Retrieve object returned by JavaScript in Java在 Java 中检索 JavaScript 返回的对象
【发布时间】:2014-02-28 10:36:40
【问题描述】:

通过在 Java 7 中使用 JavaScript API,我能够编译和调用 JavaScript 函数。问题在于 JavaScript 函数返回的值。简单类型可以很容易地进行类型转换。但是,如果 JavaScript 函数返回一个对象。如何将返回的对象转成json字符串?

    ScriptEngineManager mgr = new ScriptEngineManager();
    ScriptEngine se = mgr.getEngineByName("JavaScript");
    if (se instanceof Compilable) {
        Compilable compiler = (Compilable) se;
        CompiledScript script = compiler
                .compile("function test() { return { x:100, y:200, z:150 } }; test();");
        Object o = script.eval();
        System.out.println(o);
    } else {
        System.out.println("Engine cann't compile code.");
    }

如何将 JavaScript 返回的对象转换为 JSON 字符串?

【问题讨论】:

    标签: javascript java-7


    【解决方案1】:

    也许适用于 Java 的 Google JSON 库 (GSON) 对您有用:

    https://code.google.com/p/google-gson/

    您可以使用它们对对象进行序列化/反序列化,只要您使用正确的 getter 和 setter 定义它们的类,它们必须与您应该在 eval 指定的 Bindings 匹配strong> 打电话。

    如果您需要在序列化之前检查返回的对象属性,请定义一个与此类似的类。

    public class Serializer {
        static public Map<String, Object> object2Map(NativeObject o)
        {
            Map<String, Object> ret = new HashMap<>();
            for(Object keyField: o.getAllIds())
            {
                try {
                    Object valObject = o.get(keyField.toString());
                    ret.put(keyField.toString(), valObject);
                } catch (Exception e) {
                    continue; 
                }
            }
            return ret;
        }
    }
    

    并用它来映射地图中的对象属性。

    想法是遍历对象属性,然后生成特定类的对象,GSON可以使用或自己生成JSON字符串。

    【讨论】:

    • GSON 只能在返回的对象中定义了属性的情况下才能工作,这里不是这种情况。 script.eval() 方法返回 NativeObject。 GSON 在这里没有用处!
    • @Chir 您可以尝试使用代码反射 (getDeclaredFields) 向对象询问其属性。
    • 不幸的是,NativeObject 类型的对象没有给我关于它拥有的属性的正确信息。
    • @Chir object.getClass() 没有列出 JSON 字段吗?如果答案是没有,那么我的方法是没用的。您是否尝试在 eval 调用时指定绑定。
    • @Chir 我刚刚将您的代码复制到编辑器中并使用它:NativeObject o = (NativeObject)script.eval(); for(Object cf: o.getAllIds()) System.out.println("F:" + cf.toString() + "-----" + o.get(cf.toString()).toString() );为什么不使用此代码来构建 JSON,唯一的困难是管理嵌套对象,但使用递归算法可以轻松完成
    猜你喜欢
    • 2021-11-09
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2015-02-18
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多