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

时间:2011-05-18 14:36:25

标签: java json rhino

有没有办法在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的类。我不会在运行时知道对象的结构。

5 个答案:

答案 0 :(得分:3)

看看RingoJS。它为Rhino的列表和地图提供了方便的包装,例如this one

答案 1 :(得分:1)

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

答案 2 :(得分:1)

迭代器似乎是关键!

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

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

答案 3 :(得分:0)

我有similar problem可能有用。我尝试创建了原生的rhino对象并将数据复制到它们中。

答案 4 :(得分:0)

从 Rhino 1.7.12 开始,您可以创建 ES6 lambdas 并因此创建您自己的实用程序函数,如下所示:

function iterateMap(map, callback) {
    var iter = map.keySet().iterator();
    while(iter.hasNext()) {
        var key = iter.next();
        var value = map.get(key);
        callback(key, value);
    }
}

然后像这样迭代

iterateMap(map, (key, value)=>{
    //...
});