这与this other SO question about arrays非常相似。
如果我评估:
y = {a: 1, b: 2, "momomomo": function() { return "hi"; }, zz: "wham"}
在通过JSR223(ScriptingEngine)实例化的Javascript脚本中,我得到某种类型的NativeObject
(我在Eclipse的调试器中看到这一点),并且不知道如何访问其属性。此外,我甚至不知道哪个.jar文件,如果有的话,我需要添加到我的构建路径,以便能够使用相关的类,如果我找到一个在Rhino Javascript中工作的方法,它是没用的Jython的。
似乎JSR223应该包含与ScriptingEngine无关的语言访问方法,以便能够将返回的对象包装为数组的List<Object>
或关联数组的Map<String, Object>
。
有什么建议吗?
答案 0 :(得分:0)
我也试图使用比jsr223或bsf更多的功能嵌入不同的脚本语言。为此,我必须定义自己的接口并围绕每个不同的脚本引擎实现。
我想要的一个功能是能够将一个Function(带有单个方法的java接口)传递给我的脚本引擎,并让它在传递参数时正常工作。我的每个嵌入式脚本引擎都有一个层,我从脚本环境中包装/解包java值。
我建议解决问题的最佳方法是让你的脚本引擎包装器提供一个getValue(String名称)并让它修复javascript数组,将它们转换为java列表。当然,setValue(String,Object)将检查该值是否为List并将其转换回js数组,依此类推。它乏味:()
答案 1 :(得分:0)
将其转换为java对象并返回它。然后,您可以像平常一样使用java对象。
以下是转换函数的示例
function convertToJava(o) {
var rval;
if (Array.isArray(o)) {
rval = new java.util.ArrayList();
for (var key in o) {
rval.add(convertToJava(o[key]));
}
}
else if (typeof o === 'object') {
rval = new java.util.HashMap();
for (var key in o) {
rval.put(key, convertToJava(o[key]));
}
}
else if (typeof o === 'function') {
// skip
}
else if (typeof o === 'undefined') {
// skip
}
else {
rval = o;
}
return rval;
}