含函数的JavaScript对象处理咨询:替代com.fasterxml.jackson方案
处理含函数的JavaScript对象的替代方案
你碰到的核心问题是:Jackson是严格遵循JSON标准的解析器,而JSON规范里根本不允许函数作为对象属性值,所以带onCellDoubleClicked这类函数的JS对象,Jackson肯定解析失败。
下面给你几个能处理这种JS对象的工具/方案:
- Rhino:这是Mozilla官方用Java实现的JavaScript引擎,能直接解析并执行完整的JS代码,包括带函数的对象。用法大概是这样:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("rhino"); // 注意要把JS对象用括号包起来,避免语法歧义 String jsObjStr = "{\n \"headerName\": \"Column1\",\n \"field\": \"COLUMN1\",\n \"onCellDoubleClicked\": (event) => {\n this.onCellDoubleClicked(this, event, \"COLUMN1\");\n }\n}"; Object jsObject = engine.eval("(" + jsObjStr + ")"); // 之后可以通过ScriptObjectMirror类型转换,访问属性或者调用函数
- Nashorn:JDK 8到JDK 10内置的JS引擎(JDK 11开始被标记为废弃并移除),用法和Rhino类似,不需要额外引入依赖(JDK8环境下)就能解析JS对象:
ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn"); String jsCode = "var targetObj = " + jsObjStr + "; targetObj;"; Object result = engine.eval(jsCode); // 如果要调用函数,可以转成Invocable接口执行 if (engine instanceof Invocable) { Invocable invocable = (Invocable) engine; invocable.invokeMethod(result, "onCellDoubleClicked", someEventObj); }
- Jackson自定义反序列化(不换工具):如果只是想把函数代码作为字符串保留,不想真正执行,也可以给Jackson写个自定义反序列化器,把函数部分当成字符串解析存储,后续再自行处理执行逻辑。但如果需要真正调用函数,还是用JS引擎更直接。
⚠️ 注意:用JS引擎解析执行外部传入的JS代码时,要警惕代码注入风险,确保输入的JS内容是可信的。
内容的提问来源于stack exchange,提问作者ericute
相关产品推荐
相关产品推荐

