这个问题是很久以前提出的,但答案似乎仍然正确。如果其他尝试在 Java 和 Javascript 之间传递复杂对象的人感兴趣,我想介绍我的解决方案。
我编写了一个脚本,将 NativeObject 转换为(内存中的)JSON 对象(实际上我使用 MongoDB 的基于 BSON 的对象,但您应该能够在下面的示例代码中用 1-1 替换 JSONArray 和 JSONObject)。
例如,假设我有一个(用户)脚本“create_object_script”,它“返回”一些感兴趣的对象或数组,然后我可以将其转换为 JSON(即哈希图列表),如下所示:
Object returnVal = engine.eval(create_object_script);
engine.put("output", returnVal);
BasicDBObject objFactory = new BasicDBObject(); // (or JSON equivalent)
BasicDBList listFactory = new BasicDBList(); // (or JSON equivalent)
BasicDBList outList = new BasicDBList(); // (or JSON equivalent)
engine.put("objFactory", objFactory);
engine.put("listFactory", listFactory);
engine.put("outList", outList);
engine.eval(parsing_script); // (described below)
// "outList" is now populated with (in-memory) JSON representations of "returnVal"
显然,如果您可以控制“create_object_script”脚本,您可以一步完成;我的脚本是用户生成的,因此隐藏这种复杂性是必要的——用户只需编写脚本,其中“返回值”是最后一行。
我在这里给出了“parsing_script”以减少这篇文章的长度。
从功能上讲,这很好用;我没有在 JS 中开发太多,所以可能有更有效的方法来做到这一点。(注意我总是需要我的结果在一个列表中,如果你不这样做,那么你可以传入一个 BasicDBObject“outObj”并在单例情况下写入它)。
希望这对昨晚凌晨 1 点发现自己处于我境地的人有所帮助!