You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 10:22:52