加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 03:06:58 所属栏目:Java 来源:网络整理
导读:我对Nashorn很新,并且在JVM之上编写脚本,并想知道我是否可以让我的 java代码和 javascripts更有效地进行通信. 我正在使用与JS对象一起使用的第三方JS库,在我的java代码中,我将要传递的数据作为Map String,Object数据. 因为第三方JS希望使用普通的JS对象,所以
我对Nashorn很新,并且在JVM之上编写脚本,并想知道我是否可以让我的 java代码和 javascripts更有效地进行通信.

我正在使用与JS对象一起使用的第三方JS库,在我的java代码中,我将要传递的数据作为Map< String,Object>数据.

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

我正在使用的脚本在data参数上使用’hasOwnProperty’,并且在Java对象上调用时失败.

当我尝试使用Object.prototype.hasOwnProperty.call(data,’myProp’)时,它也不起作用并且总是返回’false’.基本问题是Java Object不是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);

这可以按预期工作,但所有这些来回JSON解析很重,感觉可能有更简单,更快速和更直接的方式来做到这一点.

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

我已经看过this使用mustache.js进行模板渲染的指南,但它做的几乎完全相同.

谢谢 !

解决方法

Nashorn专门处理java.util.Map对象. Nashorn允许将Map键视为“属性”.另见 https://wiki.openjdk.java.net/display/Nashorn/Nashorn+extensions#Nashornextensions-SpecialtreatmentofobjectsofspecificJavaclasses

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读