GraalVM中JSON.stringify无法正常处理Map对象,求助解决方法
解决GraalVM中JSON.stringify无法处理Java Map的问题
问题原因
Graal.js默认不会将Java的Map实例映射为JavaScript的普通对象,因此JSON.stringify无法识别Map中的键值对,最终输出空对象{}。
解决方案
方案1:在JS中将Java Map转为JS对象
直接在JavaScript代码里通过Java Map的entrySet()方法遍历键值对,转换为JS原生对象后再序列化:
修改后的Java代码:
HashMap<String, String> obj = new HashMap<>(); obj.put("f", "f"); obj.put("c", "c"); ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("graal.js"); engine.put("obj", obj); // 转换为JS对象后再序列化 System.out.println(engine.eval( "const jsObj = Object.fromEntries(obj.entrySet().map(entry => [entry.getKey(), entry.getValue()]));\n" + "JSON.stringify(jsObj)" ));
执行后会输出正确的{"f":"f","c":"c"}。
方案2:配置Graal.js自动映射Java Map为JS对象
通过设置Graal.js的引擎选项,让Java Map在JS环境中自动具备普通对象的行为,这样JSON.stringify可以直接处理:
HashMap<String, String> obj = new HashMap<>(); obj.put("f", "f"); obj.put("c", "c"); ScriptEngineManager manager = new ScriptEngineManager(); // 获取Graal.js引擎工厂 GraalJSScriptEngineFactory factory = (GraalJSScriptEngineFactory) manager.getEngineFactories().stream() .filter(f -> f.getEngineName().equals("Graal.js")) .findFirst() .orElseThrow(() -> new RuntimeException("Graal.js engine not found")); // 设置选项,开启Java对象到JS对象的映射 Map<String, Object> options = new HashMap<>(); options.put("js.java-object-map", true); ScriptEngine engine = factory.getScriptEngine(options); engine.put("obj", obj); System.out.println(engine.eval("JSON.stringify(obj)"));
此方案不需要修改JS代码,开启配置后JSON.stringify就能直接序列化Java Map。
方案3:Java层提前序列化Map为JSON字符串
如果不需要在JS中操作Map对象,可以直接在Java层将Map转为JSON字符串,再传入JS环境(需引入Jackson等JSON库依赖):
HashMap<String, String> obj = new HashMap<>(); obj.put("f", "f"); obj.put("c", "c"); // 使用Jackson序列化Map ObjectMapper mapper = new ObjectMapper(); String jsonStr = mapper.writeValueAsString(obj); ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = manager.getEngineByName("graal.js"); engine.put("jsonStr", jsonStr); // 直接输出或在JS中使用该字符串 System.out.println(engine.eval("jsonStr"));
内容的提问来源于stack exchange,提问作者Mohammad Kermani
相关产品推荐
相关产品推荐

