Forma efectiva de pasar JSON entre java y javascript
Soy bastante nuevo en Nashorn y tengo scripts en la parte superior de la JVM y quería saber si puedo obtener mi código java y javascripts para comunicarme de manera más efectiva.
Estoy usando una biblioteca JS de terceros que funciona con objetos JS, y en mi código Java tengo los datos que quiero pasar comoMap<String, Object> data
.
Debido a que JS de terceros espera trabajar con objetos JS simples, no puedo pasar midata
tal como está, aunque el motor de secuencias de comandos le permite acceder a un Mapa como si fuera un objeto JS simple.
El script que estoy usando usa 'hasOwnProperty' en el argumento de datos y falla cuando se invoca en un objeto Java.
Cuando intenté usar Object.prototype.hasOwnProperty.call (data, 'myProp') tampoco funcionó y siempre devolvió 'false'. El problema básico es que un objeto Java no es un prototipo de objeto javascript.
lo que terminé haciendo algo como esto:
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);
Esto funciona como se esperaba, pero todo este análisis JSON de ida y vuelta es pesado y parece que podría haber una forma más simple, rápida y directa de hacerlo.
Entonces, ¿hay una mejor manera de pasar JSON entre Java y Javascript o una forma de crear un objeto JS compatible en mi código Java?
He vistoesta guía para la representación de plantillas con mustache.js pero está haciendo más o menos lo mismo.
Gracias !