处理前
处理后
通过对查询结果的递归向下遍历, 将所有的数组内容, 全部转为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博客