如何使用Nashorn将Javascript对象从Java传递到Javascript

如何使用Nashorn将Javascript对象从Java传递到Javascript,javascript,java,nashorn,scriptengine,Javascript,Java,Nashorn,Scriptengine,我有一个字符串形式的JavaScript对象(实际上来自数据库),我需要使用Nashorn(Java8)将其传递给JavaScript函数。引擎在javascript中将传递的参数视为字符串。我希望它将其标识为Javascript对象 下面是代码片段: String script = "function genData(dataModel) { return 'hello world '+ dataModel.url.value + ' done'; }"; //"{url : {valu

我有一个字符串形式的JavaScript对象(实际上来自数据库),我需要使用Nashorn(Java8)将其传递给JavaScript函数。引擎在javascript中将传递的参数视为字符串。我希望它将其标识为Javascript对象

下面是代码片段:

String script = "function genData(dataModel) { return 'hello world '+ dataModel.url.value + ' done'; }";  

//"{url : {value : "abc.com",type  : "string"},layout : {value : "",type  : "string"}}";  

String dataModel = "{url : {value : \"abc.com\",type  : \"string\"},layout : {value : \"\",type  : \"string\"}}";

ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("JavaScript");
Invocable inv = (Invocable) engine;
result = inv.invokeFunction("genData", dataModel);
我得到的错误是:

javax.script.ScriptException:TypeError:无法从第1行的未定义中读取属性“value”

您可以先将dataModel字符串转换为JSON-在函数本身或其他地方,然后传递它

例如:

String dataModel = ...;
// convert the string as a JSON object
engine.put("dataModel", dataModel);
JSObject obj = (JSObject)engine.eval("JSON.parse(dataModel)");
...
// dataModel is a script object - as it is a result of JSON.parse
// pass it as parameter for genData
inv.invokeFunction("genData", obj);

如果您的数据模型是一个简单的Java
Map
,那么您可以将其作为参数直接传递给
invokeFunction
。对于更高级的使用,您的参数应该实现
绑定
接口

为了简化这一过程,我编写了一个名为:

:


您的数据模型不是一个有效的字符串文本……其目的是显示javascript对象的外观,并使其不那么神秘。我已将其作为注释移动,并转义了字符串(如果有帮助的话)
    Json j = new Json("a", 5);
    Double result = (Double) eng.eval("a+1", j);