java使用ScriptEngine执行javaScript返回的数组变成对象的问题解决办法

16 篇文章 0 订阅

处理前

处理后

通过对查询结果的递归向下遍历, 将所有的数组内容, 全部转为Java的ArrayList再返回, 就可以解决此问题

package cn.com.baidu.groovy

import com.alibaba.fastjson.JSONObject
import jdk.nashorn.api.scripting.ScriptObjectMirror
import javax.script.Bindings
import javax.script.Compilable
import javax.script.CompiledScript
import javax.script.ScriptEngine
import javax.script.ScriptEngineManager

class SQLResultJavaScript{

    // 查找并创建指定脚本引擎
    private ScriptEngine engine = new ScriptEngineManager().getEngineByName("javascript");

    Object executeScriptFunction(Object params, String script){
        // 初始化Bindings
        Compilable compilable = (Compilable) engine;
        Bindings bindings = engine.createBindings(); //Local级别的Binding
        // 绑定参数
        bindings.put("result", params);
        try {
            // 解析编译脚本函数
            CompiledScript JSFunction = compilable.compile(script);
            // 获取执行结果
            Object result = JSFunction.eval(bindings);
            if(result == null) {
                JSONObject jsonObject = new JSONObject();
                return jsonObject;
            }
            if (result instanceof ScriptObjectMirror) {
                // 遍历所有值
                ScriptObjectMirror scriptObjec = (ScriptObjectMirror) result;
                // 递归处理查询结果的数组
                recursionEencapsulation(scriptObjec);
                return scriptObjec;
            }else {
                return result;
            }
        } catch (Exception e) {
            if (e instanceof javax.script.ScriptException || e instanceof NoSuchMethodException) {
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("scriptException", e.getMessage());
                return jsonObject;
            }else{
                throw e;
            }
        }
        return null;
    }

    // 递归封装数组
    public void recursionEencapsulation(ScriptObjectMirror scriptObject) {
        for(String key : scriptObject.keySet()){
            Object mirror = scriptObject.get(key);
            if (mirror instanceof ScriptObjectMirror) {
                recursionEencapsulation(mirror);
                Boolean isArray = isArray(mirror);
                if(isArray) {
                    List<Object> list = parseArray(mirror);
                    scriptObject.put(key, list);
                }
            }
        }
    }
    
    // 判断是否为数组
    public Boolean isArray(ScriptObjectMirror scriptObject) {
        boolean isArray = true;
        int index = 0;
        for(String key : scriptObject.keySet()){
            if(!key.equals(index+"")) {
                isArray = false;
            }
            index++;
        }
        return isArray;
    }
    
    // 将数组转为ArrayList
    public List<Object> parseArray(ScriptObjectMirror scriptObject) {
        List<Object> arrayList = new ArrayList<Object>();
        for(String key : scriptObject.keySet()){
            Object obj = scriptObject.get(key);
            arrayList.add(obj);
        }
        return arrayList;
    }

}

SQLResultJavaScript文件为.groovy文件 , 如果没有使用过groovy需要先了解下面的

SpringBoot项目Java中集成Groovy敏捷开发语言_springboot集成groovy_会飞的哈士奇的博客-CSDN博客

IDEAJava项目使用Groovy文件编译的时候报错的解决, 以及Groovy的使用_idea idea不能识别groovy文件_会飞的哈士奇的博客-CSDN博客

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值