我正在和 org.graalvm.polyglot
在java11项目中使用脚本引擎来评估javascript。
要计算的脚本返回一个包含两个条目的javascript数组。
...
var result={};
result.isValid=false;
result.errorMessage = new Array();
result.errorMessage[0]='Somehing go wrong!';
result.errorMessage[1]='Somehingelse go wrong!';
....
在java代码中,我尝试计算结果对象:
Value resultValue = context.getBindings(languageId).getMember("result");
在eclipse调试器中,我可以看到收到一个包含预期值的polyglotmap:
我可以使用如下代码迭代该Map以获取值:
...
try {
mapResult = resultValue.as(Map.class);
} catch (ClassCastException | IllegalStateException | PolyglotException e) {
logger.warning("Unable to convert result object");
return null;
}
Iterator it = mapResult.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry) it.next();
String itemName = pair.getKey().toString();
Object itemObject = pair.getValue();
...
通过这种方式,我能够提取布尔值“isvalid”。但对于对象“errormessage”,我很挣扎。
在eclipse调试器中再次检查对象,如下所示:
如果我测试这个对象,它就是一个Map的示例。但是我无法从这个对象中获取任何值。
有人能帮我理解这个对象到底代表什么,以及我如何提取这两个值吗 'Someting go wrong!'
及 'Sometingelse go wrong!'
?
当我迭代第二个Map时,它似乎是空的——即使调试器向我显示了正确的值。
1条答案
按热度按时间mlmc2os51#
我不是100%确定为什么
as(Map.class)
这样的话,在github上创建一个问题来解决它可能是值得的:github.com/oracle/graal但是,如果您使用api访问这些值而不转换为Map,那么它将按照您的预期工作:
您还可以将polyglotmap转换为value,然后执行以下操作:
polyglotmap当然有
get
方法。javadoc的值表示:你能试着用长钥匙拿吗?我可能遗漏了一些明显的东西,所以无论如何,最好在github上提出一个问题。