如何使用 Rhino 从 javascript 函数中的 Java HashMap 获取值

How to get values from a Java HashMap in javascript function using Rhino

我正在使用 Rhino 库执行 Javaandroid 中的脚本函数。我有一个 javascript 函数,例如

var exucuteJS = function(controlValues) {
var valueSelected = controlValues['country'];
valueSelected = valueSelected.toUpperCase();
 switch (valueSelected) {
    case "INDIA":
        return "IND_HOME";
    case "NEPAL":
        return "NEP_HOME";
    default:
        return "DEF_HOME"
 }
}

我将 Java HashMap 对象作为参数传递给函数 executeJS,比如 controlValues。问题是,Rhino 无法通过 javascript 代码从键中获取值。

var valueSelected = controlValues['country'];

return 值未定义。

这条线很好用,

var valueSelected = controlValues.get('country');

但它是无效的 javascript 代码。

在android和iOS中都执行相同的javascript。 iOS 不支持以上行。请建议。我正在使用最新版本的 Rhino。

访问复杂对象数据的唯一方法是使用其接口。您需要为 Android 和 ios 创建单独的解决方案。

typeof 运算符应该可以帮助您在这些情况之间切换。

终于自己找到了答案。

而不是将 HashMap 发送到 javascript 函数,需要将其作为 JSONObject 发送。不像普通的 JSONObject 的对象,而是像 NativeJSON 对象形式的对象。

Object nativeJsonObject= NativeJSON.parse(rhino,scope,controlValueJsonString,new NullCallable());

其中, rhino - Rhino 的上下文对象。 scope - Scriptable 的对象 controlValueJsonString - JSON 相当于 HashMap 的字符串。 (controlValueJsonString = new Gson().toJson(hashMap);)

NullCallable 是一个 class 从 Callable 实现的,(来自 rhino 的包 org.mozilla.javascript.Callable)

这个 'nativeJsonObject' 应该传递给 javascript 函数。

Object[] params = new Object[] { controlValues };

从 JSON 对象中,javascript 可以获得值,

var valueSelected = controlValues['country'];

这对我有用。真的,我不知道为什么对这个问题投反对票。 管理员,请注意此问题。

无需实施 NullCallable class 的更简单解决方案是

new JsonParser(context, scope).parseValue("{\"this is\":\"JSON\"}");

我在 Rhino: return JSON from within Java

找到的