在Rhino中访问java Maps&Lists作为JavaScript对象

有没有办法在Rhino中访问Java Maps和Lists作为JavaScript对象?

我有一个Map只包含其他地图和基元和字符串列表,我想将它传递给Rhino脚本并对其进行处理,然后将修改后的对象返回给Java – 但由于它们是java.util .Map和java.util.List对象,我不能使用标准的JavaScript关联数组语法。 即: fooMap.get("keyName")将起作用,但fooMap.keyNamefooMap["keyName"]不会。

我不知道是否有特定于Rhino的方法来执行此操作,或者是否有一些转换/强制转换实用程序可以提供帮助。 Commons BeanUtils是不够的,因为要将Map转换为bean(可以通过关联数组语法访问),首先必须创建一个包含所有命名mutator / accessors的类。 我不会在运行时知道对象的结构。

看看RingoJS。 它有一个方便的包装列表和Rhino的地图,如这个

https://developer.mozilla.org/en/New_in_Rhino_1.7R3#JS.c2.a0Objects_implement_Java_collections声称JS对象可以使用。 数组现在可以转换为Map resp。 List ,但这似乎不适用于您的用例。

迭代器似乎是关键!

如果要迭代地图的所有条目,可以执行以下操作

JAVA

 //pass the map and map.keySet().iterator() to the javascript Object wrappedParameterMap = Context.javaToJS(parameterMap, scope); ScriptableObject.putProperty(scope, "parameterMap", wrappedParameterMap); Object wrappedParameterNames = Context.javaToJS(parameterMap.keySet().iterator(), scope); ScriptableObject.putProperty(scope, "parameterNames", wrappedParameterNames); 

JAVASCRIPT

 while(parameterNames.hasNext()) { key = parameterNames.next(); value = parameterMap.get(key); } 

我有一个类似的问题可能有用。 我尝试创建本机rhino对象并将数据复制到其中。