gpt4 book ai didi

java - Nashorn ScriptObjectMirror JS -> Java 类型转换

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:43:10 24 4
gpt4 key购买 nike

当我使用 Nashorn ScriptObjectMirror.get() 访问 JavaScript 对象的成员变量时,返回对象的类型似乎是在运行时确定的。例如,如果值适合 Java int,则 get() 似乎返回 Java Integer。如果值不适合 int,get() 似乎返回 Java Long,等等。

现在,我使用 instanceof 检查类型并将值转换为 long。

在 Java 中有没有更方便的方法来获取成员的值而不丢失并且不检查类型?也许 Nashorn 总能给我一个 Java Double,在成员不是数字的情况下抛出错误。

我可以想象这是一个相当狭窄的案例,可能不应该由 Nashorn 处理......

例子:

package com.tangotangolima.test.nashorn_types;

import jdk.nashorn.api.scripting.ScriptObjectMirror;

import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.StringReader;

public class Main {

public static void main(String[] args) throws ScriptException {
final ScriptEngineManager mgr = new ScriptEngineManager();
final ScriptEngine js = mgr.getEngineByName("nashorn");

final String script = "" +
"var p = 1;" +
"var q = " + (Integer.MAX_VALUE + 1L) + ";" +
"var r = {" +
"s: 1," +
"t: " + (Integer.MAX_VALUE + 1L) +
" };";

js.eval(new StringReader(script));

say(js.get("p").getClass().getName()); // -> java.lang.Integer
say(js.get("q").getClass().getName()); // -> java.lang.Long

final ScriptObjectMirror r = (ScriptObjectMirror) js.get("r");

say(r.get("s").getClass().getName()); // -> java.lang.Integer
say(r.get("t").getClass().getName()); // -> java.lang.Long
}

static void say(String s) {
System.out.println(s);
}
}

最佳答案

这段代码可以做ScriptObjectMirror JS -> Java转换

private static Object convertIntoJavaObject(Object scriptObj) {
if (scriptObj instanceof ScriptObjectMirror) {
ScriptObjectMirror scriptObjectMirror = (ScriptObjectMirror) scriptObj;
if (scriptObjectMirror.isArray()) {
List<Object> list = Lists.newArrayList();
for (Map.Entry<String, Object> entry : scriptObjectMirror.entrySet()) {
list.add(convertIntoJavaObject(entry.getValue()));
}
return list;
} else {
Map<String, Object> map = Maps.newHashMap();
for (Map.Entry<String, Object> entry : scriptObjectMirror.entrySet()) {
map.put(entry.getKey(), convertIntoJavaObject(entry.getValue()));
}
return map;
}
} else {
return scriptObj;
}
}

public static void main(String[] args) throws ScriptException, NoSuchMethodException {
final ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
engine.eval("function objProvider(){return {a:1, b:'2','c': true,'d': {'e':[],'f':['1',{'g':45}]}};}");
final Object scriptObj = ((Invocable) engine).invokeFunction("objProvider");

Object javaObj = convertIntoJavaObject(scriptObj);
System.out.println(javaObj);
//{a=1, b=2, c=true, d={e=[], f=[1, {g=45}]}}
}

关于java - Nashorn ScriptObjectMirror JS -> Java 类型转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33632420/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com