为什么JavaNashnorn库无法正确评估JS代码?

问题描述

我有一些代码可以在像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.parse()语句将字符串转换为JSON对象。

再次非常感谢。