Tag: 纳什恩

Nashorn,将java对象传递给javascript以JSON.stringified

我想从Kotlin传递一个数据类到JavaScript,并将其作为JSON序列化: engine.eval("""function jsFunction(pojo) { print(pojo); JSON.stringify({ "field": pojo })}""") engine.invokeFunction("jsFunction", Pojo(a="a", b="b")) 结果我会喜欢将是一个JSON与: { "field": { "a": "a", "b": "b" } } 但是结果是{} print功能打印出Pojo[a=a, b=b] ,因此至少该对象正确传递。 如果我打印的pojo类型,我得到的object 。 如果我做: engine.eval("""function jsFunction(pojo) { print(pojo); JSON.stringify({ "field": pojo.a })}""") engine.invokeFunction("jsFunction", Pojo(a="a", b="b")) 那么我得到: { "field": "a" } 但是,这样做的目的是失败的。 我想获得开箱即用的完整结构。 如果我手动将对象串行化成json,然后将它传递给js函数: engine.eval("""function jsFunction(pojoJson) { pojo = JSON.parse(pojoJson); print(pojo); […]

我怎么能通过一个适当的方法参考,所以Nashorn可以执行它?

我正在尝试编写一个库,让我通过Nashorn Javascript引擎执行JSON逻辑规则。 我现在的问题是围绕着我创建的JSObject包装器来处理将数据从Java / Kotlin移动到脚本引擎中。 如果一个数组被传入,例如[true]它将被包装,并且json-logic脚本会接收它,看它是一个数组,并且尝试运行下面的代码: if(Array.isArray(logic)) { return logic.map(function(l) { return jsonLogic.apply(l, data); }); } 当调用.map函数时,Nashorn会调用getMember("map")来获取可执行的函数。 这是我卡住的地方。 我一直无法找到任何合适的语法给Nashorn一个方法或方法的引用,可以作为它的地图函数的接收器调用。 代码可以在这里找到: https : //github.com/deinspanjer/json-logic-java有一些基本的单元测试,包括发生问题的单元测试, JavaJsonLogicTest.simpleApplyJEJO() 。 破解的代码行是com/jsonlogic/JSObjectWrappers.kt:97 。 我非常感谢你的帮助。 更新:基于接受的答案,这里是工作Kotlin版本的代码: package com.jsonlogic import jdk.nashorn.api.scripting.AbstractJSObject import jdk.nashorn.api.scripting.JSObject import java.util.function.Function import javax.script.ScriptEngineManager fun main(args: Array<String>) { val m = ScriptEngineManager() val e = m.getEngineByName("nashorn") // The following JSObject […]