Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java和javascript之间传递JSON的有效方法_Java_Nashorn_Scriptengine - Fatal编程技术网

在java和javascript之间传递JSON的有效方法

在java和javascript之间传递JSON的有效方法,java,nashorn,scriptengine,Java,Nashorn,Scriptengine,我对Nashorn和JVM之上的脚本编写相当陌生,我想知道我是否可以让java代码和java脚本更有效地进行通信 我使用的第三方JS库与JS对象一起工作,在我的java代码中,我有我想要作为映射数据传递的数据 因为第三方JS希望使用普通JS对象,所以我无法按原样传递我的数据,尽管脚本引擎允许您像访问普通JS对象一样访问地图 我正在使用的脚本在数据参数上使用'hasOwnProperty',在Java对象上调用时失败 当我尝试使用Object.prototype.hasOwnProperty.ca

我对Nashorn和JVM之上的脚本编写相当陌生,我想知道我是否可以让java代码和java脚本更有效地进行通信

我使用的第三方JS库与JS对象一起工作,在我的java代码中,我有我想要作为
映射数据传递的数据

因为第三方JS希望使用普通JS对象,所以我无法按原样传递我的
数据
,尽管脚本引擎允许您像访问普通JS对象一样访问地图

我正在使用的脚本在数据参数上使用'hasOwnProperty',在Java对象上调用时失败

当我尝试使用Object.prototype.hasOwnProperty.call(数据'myProp')时,它也不起作用,总是返回'false'。基本问题是Java对象不是javascript对象原型

我最终做了这样的事情:

Map<String, Object> data;

ObjectMapper mapper = new ObjectMapper();   
String rawJSON = mapper.writeValueAsString(data);

ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");

engine.eval('third_party_lib.js');
engine.eval('function doSomething(jsonStr) { var jsObj = JSON.parse(jsonStr); return doSomethingElse(jsObj); }');
Object value = ((Invocable) engine).invokeFunction("doSomething", rawJSON);
地图数据;
ObjectMapper mapper=新的ObjectMapper();
字符串rawJSON=mapper.writeValueAsString(数据);
ScriptEngine=new ScriptEngineManager().getEngineByName(“nashorn”);
engine.eval('third_party_lib.js');
eval('function doSomething(jsonStr){var jsObj=JSON.parse(jsonStr);return doSomethingElse(jsObj);}');
对象值=((Invocable)引擎).invokeFunction(“doSomething”,rawJSON);
这正如预期的那样工作,但所有这些JSON来回解析都很繁重,感觉可能有更简单、更快和更直接的方法来完成

那么,有没有更好的方法在Java和Javascript之间传递JSON,或者在我的Java代码中创建兼容的JS对象

我已经看过使用mustache.js进行模板渲染的指南,但它做的事情基本相同


谢谢

Nashorn专门处理java.util.Map对象。Nashorn允许将贴图键视为“属性”。另见


所以,如果您的映射包含“foo”作为键,则脚本可以访问mapObj.foo以获取其值。您评估的脚本是第三方脚本并不重要。只要脚本是由Nashorn评估的,Nashorn就会专门链接Map属性访问并得到您想要的结果。这种方法避免了不必要的JSON字符串转换和解析往返(正如您自己提到的)。

您希望通过这种方法实现什么?要添加一种可编写脚本的方式来调用Java应用程序的功能并对Java应用程序中阐述的数据模型进行操作(Nashorn的设计意图),或者模拟Node.js并调用任意Javascript代码?我根本不是从Javascript调用Java函数,恰恰相反,我希望我的Java应用程序调用javascript函数。我的具体案例是使用React.js进行渲染,但我假设这是handlebar.js\mustache.js或任何其他使用JSON对象的javascript库的常见用例。谢谢您的回答。没错,我可以像访问任何其他属性一样访问密钥,但我的问题是Map对象不支持第三方库使用的“hasOwnProperty”等本机javascript功能。我更新了问题,让我的问题更清楚。好的,我明白了。在这种情况下,通过JSON进行往返似乎是不可避免的。感谢您的提示。以下是工作代码示例: