【问题标题】:Why is Java (Nashnorn library) not evaluationg JS code correctly?为什么 Java(Nashorn 库)不能正确评估 JS 代码?
【发布时间】: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


【解决方案1】:

感谢所有回复的人。

问题是,正如第一个人所说,我忘记了将字符串转换为 JSON 对象的 JSON.parse() 语句。

再次非常感谢。

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    相关资源
    最近更新 更多