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

如何在Java中获取JavaScript返回的数组并转为Java数组?

How to Convert Nashorn's JavaScript Array to a Java Array

我明白你遇到的问题了——当你用Nashorn调用JS函数返回数组时,得到的其实是Nashorn内部的JS数组对象,直接调用toString()就会输出JS对象的默认字符串表示[object Array...]。要把它转换成Java数组,我们可以用两种简单的方式实现:

方法1:直接类型转换(最简便)

如果你的JS数组元素类型统一(比如都是字符串),可以直接将返回的对象强制转换为对应的Java数组类型,Nashorn会自动完成转换逻辑:

import javax.script.*;
import java.io.FileReader;

public class NashornArrayTest {
    public static void main(String[] args) {
        try{
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
            engine.eval(new FileReader("fun.js"));
            Invocable invocable = (Invocable) engine;
            
            // 直接转换为String类型的Java数组
            String[] javaArray = (String[]) invocable.invokeFunction("fun1");
            
            // 验证输出
            for (String item : javaArray) {
                System.out.println(item);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
    }
}

如果不确定JS数组的元素类型,也可以先转换为Object[]数组,再根据实际场景处理:

Object[] javaArray = (Object[]) invocable.invokeFunction("fun1");

方法2:借助JSObject接口手动转换

Nashorn的JS数组对象实现了jdk.nashorn.api.scripting.JSObject接口,我们可以通过这个接口的方法来遍历数组元素,手动构建Java数组:

import jdk.nashorn.api.scripting.JSObject;
import javax.script.*;
import java.io.FileReader;

public class NashornArrayTest {
    public static void main(String[] args) {
        try{
            ScriptEngine engine = new ScriptEngineManager().getEngineByName("nashorn");
            engine.eval(new FileReader("fun.js"));
            Invocable invocable = (Invocable) engine;
            
            // 获取JS数组对象
            JSObject jsArray = (JSObject) invocable.invokeFunction("fun1");
            
            // 构建对应长度的Java数组
            String[] javaArray = new String[(int) jsArray.getSlotCount()];
            for (int i = 0; i < javaArray.length; i++) {
                javaArray[i] = (String) jsArray.getSlot(i);
            }
            
            // 验证输出
            for (String item : javaArray) {
                System.out.println(item);
            }
        } catch(Exception e){
            e.printStackTrace();
        }
    }
}

注意事项

  • 如果JS数组中包含复杂对象(而非字符串、数字这类基本类型),转换时需要确保对应的Java类型能兼容,否则可能抛出类型转换异常。
  • 两种方法都能解决你的问题,优先推荐方法1,代码更简洁高效。

内容的提问来源于stack exchange,提问作者Rahul Choubey

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:04:09