【发布时间】:2020-08-23 12:12:07
【问题描述】:
我的代码在 Webstorm 等 JavaScript IDE 中运行良好,但是当我尝试使用 Nashorn 库(在 Java 程序中运行 JS)将其移植到 Java 时,我收到以下错误:“名称:未定义,年龄:未定义”(可能还有其他人跟随,这取决于这里出了什么问题。)
以下是完整代码。下面的这种编码方法似乎可以正常工作,但是在某些情况下我没有得到预期的结果。
如果有任何帮助或建议,我们将不胜感激。
谢谢!
public class JavaScriptEvaluationExample
{
public static void main(String[] args) throws ScriptException, NoSuchMethodException
{
// Basic JavaScript evaluation
String json = "{\n" +
" \"name\": \"John\",\n" +
" \"age\": 30,\n" +
" \"cars\": [\n" +
" {\n" +
" \"name\": \"Ford\",\n" +
" \"models\": [\n" +
" \"Fiesta\",\n" +
" \"Focus\",\n" +
" \"Mustang\"\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"name\": \"BMW\",\n" +
" \"models\": [\n" +
" \"320\",\n" +
" \"X3\",\n" +
" \"X5\"\n" +
" ]\n" +
" },\n" +
" {\n" +
" \"name\": \"Fiat\",\n" +
" \"models\": [\n" +
" \"500\",\n" +
" \"Panda\"\n" +
" ]\n" +
" }\n" +
" ]\n" +
"}";
String jsScript = "function parseJSONFields(param)\n" +
"{\n" +
" var result = \"\";\n" +
" var carName =\"\" ;\n" +
" var models = \"\";\n" +
" var name = param.name + \",\";\n" +
" var age = param.age;\n" +
" result = \"Name: \" + name + \" Age: \" + age + \"\\n\";\n" +
" for (item in param.cars)\n" +
" {\n" +
" result += \" \"+ \" >> \" + param.cars[item].name +\": \"\n" +
" result+= \" \" + param.cars[item].models\n" +
" result += \"\\n\";\n" +
" }\n" +
" return result;\n" +
"}";
System.out.println(runJS("parseJSONFields", json, jsScript));
}
// ------------------------------------------------------------------------------------------------
private static Object runJS(String functionName, String param, String script) throws ScriptException, NoSuchMethodException
// ------------------------------------------------------------------------------------------------
{
Object resultString = "";
String errorResultString = "";
ScriptEngine js = null;
try
{
if (param.length() > 0)
{
js = new ScriptEngineManager().getEngineByName("javascript");
js.eval(script);
Invocable inv = (Invocable) js;
}
}
catch (Exception e)
{
errorResultString = e.getMessage() + " ---> " + e.getMessage();
}
return errorResultString.length() > 0 ? errorResultString
: ((Invocable) js).invokeFunction(functionName, param);
}
}
【问题讨论】:
-
您将 JSON 作为
String传递。这将在 JavaScript 中表示为字符串,即不是该 JSON 的对象描述。 要么 在 Java 代码中解析它并传入一些在 JS 引擎中被接受为 Object 的东西,或者在 JavaScript 中解析它(我也不知道该怎么做,或者我会写这个作为答案)。 -
另请注意,随着 Java 11 的发布,Nashorn 已被弃用,并且可能会在以后从 JDK 中删除。
-
更新 -- 其他 JavaScript 代码使用相同的技术。
-
GraalVM 的当前版本根本不适合我。 mac 安装程序中有重复的项目,并且在以前版本的 GraalVM 中工作的代码不再工作。因此,我现在被 Nashorn 困住了……
-
还要注意“js.eval(script);”这行代码不会抛出任何错误。
标签: javascript java nashorn