首页 > 其他分享 >利用Groovy对参数进行处理

利用Groovy对参数进行处理

时间:2024-07-17 17:55:24浏览次数:16  
标签:Groovy String 处理 JSONObject keys 参数 jsonObject put new

ParamUtils代码如下:

package com.ksource.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ksource.modules.serve.entity.ServeInfo;
import groovy.lang.Binding;
import groovy.lang.GroovyShell;
import groovy.lang.Script;
import org.codehaus.groovy.control.CompilationFailedException;
import java.util.*;

/**
 * @Author dxy
 * @Date 2024/7/9 10:23
 * @Description 参数处理工具类
 */
public class ParamUtils {

    //工具类所在包1
    public static final String packageName1 = "com.ksource.utils";
    //工具类所在包2
    public static final String packageName2 = "com.ksource.common.util";

    /**
     * @description: 根据keyPath获取map中对应的value值
     * @author: dxy
     * @date: 2024/7/17 17:02
     * @param: keyPath
     * @param: mapData
     * @return: java.lang.Object
     */
    public static Object getValueFromMapByKeyPath(String keyPath, Map<String,Object> mapData){
        Object value = mapData.get(keyPath);
        if(keyPath.contains(".")) {
            String[] keys = keyPath.split("\\.");
            String mapStr = JSON.toJSONString(mapData);
            //处理map中的对象属性值 例:serveInfo.address;serveInfo.interfacingConfig.name等
            if (keys.length > 1) {
                JSONObject jsonObj = JSONObject.parseObject(mapStr);
                JSONObject jsonObjX = jsonObj;
                for (int j = 0; j < keys.length; j++) {
                    if (j < keys.length - 1) {
                        jsonObjX = jsonObjX.getJSONObject(keys[j]);
                    } else {
                        value = jsonObjX.get(keys[keys.length - 1]);
                    }
                }
            }
        }
        return value;
    }

    /**
     * @description: 根据keyPath获取jsonObject中对应的值
     * @author: dxy
     * @date: 2024/7/17 17:02
     * @param: keyPath
     * @param: jsonObject
     * @return: java.lang.Object
     */
    public static Object getValueFromJsonByKeyPath(String keyPath, JSONObject jsonObject){
        Object value = jsonObject.get(keyPath);
        if(keyPath.contains(".")) {
            String[] keys = keyPath.split("\\.");
            //处理jsonObject中的对象属性值 例:serveInfo.address;serveInfo.interfacingConfig.name等
            if (keys.length > 1) {
                JSONObject jsonObjX = jsonObject;
                for (int j = 0; j < keys.length; j++) {
                    if (j < keys.length - 1) {
                        jsonObjX = jsonObjX.getJSONObject(keys[j]);
                    } else {
                        value = jsonObjX.get(keys[keys.length - 1]);
                    }
                }
            }
        }
        return value;
    }

    /**
     * @description: 单个执行方法
     * @author: dxy
     * @date: 2024/7/17 17:03
     * @param: javaStrCode
     * @param: mapData
     * @return: java.lang.Object
     */
    public static Object execJavaStrCodeByGroovy(String javaStrCode, Map<String,Object> mapData){
        String clazzName = javaStrCode.substring(0,javaStrCode.indexOf("."));
        String clazzPath = getPathByClassName(clazzName);
        String methodParam = javaStrCode.substring(javaStrCode.indexOf("."));
        String newCodeStr = clazzPath + methodParam;
        Binding binding = new Binding(mapData);
        GroovyShell shell = new GroovyShell(binding);
        try {
            Script parse = shell.parse(newCodeStr);
            Object run = parse.run();
            return run;
        } catch (CompilationFailedException e) {
            throw new RuntimeException("执行动态脚本【"+newCodeStr+"】失败!",e);
        }
    }

    /**
     * @description: 根据包名+类名获取对应的clazz
     * @author: dxy
     * @date: 2024/7/9 13:50
     * @param: className
     * @return: java.lang.Class<?>
     */
    public static String getPathByClassName(String clazzName){
        String flag = null;
        String clazzPath = null;
        try {
            Class.forName(packageName1+"."+clazzName);
            clazzPath = packageName1+"."+clazzName;
            flag = "exist";
        }catch (Exception e){
            flag = "noExist";
        }
        if("noExist".equals(flag)){
            try {
                Class.forName(packageName2+"."+clazzName);
                clazzPath = packageName2+"."+clazzName;
                flag = "exist";
            }catch (Exception e){
                flag = "noExist";
            }
        }
        return clazzPath;
    }

    /**
     * @description: 执行多个方法
     * @author: dxy
     * @date: 2024/7/17 17:03
     * @param: transformConfig
     * @param: sourceMap
     * @return: java.util.Map<java.lang.String,java.lang.Object>
     */
    public static Map<String,Object> buildTargetMapFromSourceMap(JSONArray transformConfig, Map<String,Object> sourceMap){
        Map<String,Object> newMap = new HashMap<String,Object>();
        for(int i = 0; i < transformConfig.size(); i++){
            JSONObject jsonObject = transformConfig.getJSONObject(i);
            boolean isOut = jsonObject.getBoolean("isOut");
            String key = jsonObject.getString("name");
            String methodAttr = jsonObject.getString("value");
            Object object = execJavaStrCodeByGroovy(methodAttr, sourceMap);
            sourceMap.put(key,object);
            if (isOut){
                newMap.put(key,object);
            }
        }
        return newMap;
    }

    /**
     * @description: 对指定属性赋值
     * @author: jyf
     * @date: 2024/7/17 上午10:17
     * @param: jsonObject
     * @param: key
     * @param: value
     */
    public static void setJsonObjectValue(JSONObject jsonObject, String key, Object value) {
        String[] keys = key.split("\\.");
        JSONObject currentObject = jsonObject;
        for (int i = 0; i < keys.length - 1; i++) {
            String currentKey = keys[i];
            if (!currentObject.containsKey(currentKey) || currentObject.get(currentKey) == null) {
                currentObject.put(currentKey, new JSONObject());
            }
            currentObject = currentObject.getJSONObject(currentKey);
        }

        currentObject.put(keys[keys.length - 1], value);
    }

    public static void main(String[] args) {
        JSONObject jsonObject = new JSONObject();
        ServeInfo serveInfo1 = new ServeInfo();
        serveInfo1.setAddress("河南省郑州市中原区");
        jsonObject.put("name","张华");
        jsonObject.put("serveInfo1",serveInfo1);
        //根据key路径获取jsonObject的值
        Object obj1 = getValueFromJsonByKeyPath("serveInfo1.address",jsonObject);
        System.out.println(obj1);

        Map testMap = new HashMap();
        testMap.put("name","李可");
        testMap.put("age",15);

        //根据key路径获取map的值
        Object obj2 = getValueFromMapByKeyPath("name",testMap);
        System.out.println(obj2);

        //单方法执行
        String groovyScript = "TestJava.a2(name,age)";
        Object obj3 = execJavaStrCodeByGroovy(groovyScript, testMap);
        System.out.println(obj3);

        Map map = new HashMap();
        map.put("name","陈华");
        map.put("age",25);
        map.put("address","河南省");
        map.put("unit","上海通方系统有限公司");
        List<ServeInfo> serveInfoList = new ArrayList();
        ServeInfo serveInfo = new ServeInfo();
        serveInfo.setAddress("中原区");
        map.put("serveInfoList",serveInfoList);
        map.put("serveInfo",serveInfo);

        JSONArray jsonArray = new JSONArray();
        JSONObject jsonObject1 = new JSONObject();
        jsonObject1.put("name","test1");
        jsonObject1.put("value","TestJava.a14(name)");
        jsonObject1.put("isOut",true);

        JSONObject jsonObject2 = new JSONObject();
        jsonObject2.put("name","test2");
        jsonObject2.put("value","TestJava.a15(test1)");
        jsonObject2.put("isOut",true);

        JSONObject jsonObject3 = new JSONObject();
        jsonObject3.put("name","test3");
        jsonObject3.put("value","TestJava.a15(test2)");
        jsonObject3.put("isOut",false);

        JSONObject jsonObject4 = new JSONObject();
        jsonObject4.put("name","test4");
        jsonObject4.put("value","TestJava.a16(test2,'杨金路')");
        jsonObject4.put("isOut",true);

        jsonArray.add(jsonObject1);
        jsonArray.add(jsonObject2);
        jsonArray.add(jsonObject3);
        jsonArray.add(jsonObject4);

        //多方法执行
        Map newMap= ParamUtils.buildTargetMapFromSourceMap(jsonArray, map);
        System.out.println(newMap);
    }
}

标签:Groovy,String,处理,JSONObject,keys,参数,jsonObject,put,new
From: https://www.cnblogs.com/henuyuxiang/p/18307977

相关文章

  • pytorch|找不到 fbgemm.dll 问题处理
    问题现象运行逻辑:importtorch报错如下:Traceback(mostrecentcalllast):File"C:\scaffold\metasequoia-tyc\ner_address\test_torch.py",line1,in<module>importtorchFile"D:\py\Python310\lib\site-packages\torch\__init__.......
  • C# WinForm程序全局捕捉异常处理办法
    1.winform捕获全局异常staticclassProgram{///<summary>///应用程序的主入口点。///</summary>[STAThread]staticvoidMain(){//处理未捕获......
  • Office文件打不开如何处理
        在快节奏的现代办公环境中,MicrosoftOffice无疑是我们的得力助手,无论是起草报告、整理数据还是制作演示文稿,它都在背后默默支撑着我们的工作与学习。然而,当有一天,你突然发现重要的Office文档无法打开,屏幕上的错误信息仿佛一道无形的墙,阻隔了你与辛勤工作成果之间的......
  • 非Controller控制层参数校验怎么办
    参数校验背景通常在SpringBoot中,参数校验是在Controller控制层完成的。文章探讨了在非Controller控制层进行参数校验的方法。Validator接口Spring提供了JSR-303的一个变种@Validated。Validator接口定义了用于执行验证的方法,主要方法包括:validate(Tobject,Cla......
  • 第七章异常处理
    Bug的由来及分类语法错误知识点不熟练:练习练习再练习思路不清晰:(1)使用print函数(2)使用#暂时注释Pathon中的异常处理机制try:可能会出现异常的代码except异常类型:异常处理代码(报错后执行的代码)try:可能会出现异常的代码except异常类型A:异常处......
  • 在存储过程输入输出参数中使用json
    SqlServer从2016开始支持json操作,JSON支持适用于SqlServer2016及以上版本和AzureSQLDatabase。sqlserver文档参考这里。有了这个json支持,默认过程只传入一个json字符串参数就可以了,方便很多。我们可以在内部做很多事情。甚至可以校验参数,鉴权或将结果集封装为标准的......
  • js需要同时发起百条接口请求怎么办?--通过Promise实现分批处理接口请求
    如何通过Promise实现百条接口请求?实际项目中遇到需要发起上百条Promise接口请求怎么办?前言不知你项目中有没有遇到过这样的情况,反正我的实际工作项目中真的遇到了这种玩意,一个接口获取一份列表,列表中的每一项都有一个属性需要通过另一个请求来逐一赋值,然后就有了这份封装真......
  • 端口被占用如何处理Error: listen EADDRINUSE: address already in use :::xxxx
    启动项目出现Error:listenEADDRINUSE:addressalreadyinuse:::9088yarnrunv1.22.19$nodesrc/index.jsevents.js:377thrower;//Unhandled'error'event^Error:listenEADDRINUSE:addressalreadyinuse:::9088atServer.setupL......
  • C++入门(3)inline函数与缺省参数
    一.inline函数当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。当函数功能简单,使用频率很高,为了提高效率,直接将函数的代码镶嵌到程序中。但这个方法有缺点,一是相同代码重复书写,二是程序的可读性往往没有......
  • 揭秘 Java 变长参数:如何优雅地处理不定数量的字符串
    哈喽,大家好,我是木头左!理解变长参数:基础概念在Java中,变长参数也称为可变参数,它允许你传递任意数量的参数到一个方法中。这个特性是通过使用三个点符号...来实现的。当你在方法的参数列表中使用...时,任何传递给该方法的额外参数都会被当作数组来处理。这为提供了一种灵活的方式......