sed替换最后一个匹配_ppt占位符设置

sed替换最后一个匹配_ppt占位符设置json字符串处理

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

需求说明

最近在公司项目中遇到一个需要,需要在用户输入的入参数据中,将数据里面${}占位符的数据替换为真实的数据方式,以下提供两种方式

使用Api

  • JsonUtils:自己封装的工具类,其中对Jackson的api进行封装,可以自行替换

方式一

https://blog.csdn.net/weixin_43915643/article/details/123231563

缺点:
  • 正则表达式匹配,转换后会出现多余的引号,导致替换后的数据在转换为json格式就会出现转换不了的问题
  • 正则表达式过于复杂,后期修改就不好维护

方式二

方式二的好处在于使用了 Map的方式处理了json格式的数据,也不会出现多余的双引号的问题。缺点就是可能会出来无限深度的递归

public static String processMap(Map<String, Object> model, Object data) throws InvocationTargetException,
                                                                                   IllegalAccessException,
                                                                                   NoSuchMethodException { 
   
        //获取到所有map的key value
        Map<String, Object> valueMap = new HashMap<>(model);
        for (Map.Entry<String, Object> next : model.entrySet()) { 
   
            String modelKey = next.getKey();
            //获取到value的数据
            Object modelValue = next.getValue();
            String modelValueStr = JsonUtils.toJson(modelValue);
            boolean isJson = JsonUtils.isJson(modelValueStr);
            //处理占位符,判断是否时标准的json结构
            if (!isJson) { 
   
                //截取出占位符的key
                String process = doProcess(modelValueStr, data);
                valueMap.put(modelKey, process);
            } else { 
   
                Object parse = JsonUtils.parse(modelValueStr, Object.class);
                if (parse instanceof Map) { 
   
                //将数据为Map的进行递归处理
                    String processMap = processMap(JsonUtils.toMap(modelValueStr, String.class, Object.class), data);
                    valueMap.put(modelKey, JsonUtils.toMap(processMap, String.class, Object.class));
                }
            }
        }
        return JsonUtils.toJson(valueMap);
    }

	/** * 进行字符串的处理 */
private static String doProcess(String str, Object data) throws IllegalAccessException,
                                                                         InvocationTargetException,
                                                                         NoSuchMethodException { 
   
        Matcher matcher = PLACEHOLDER_PATTERN.matcher(str);
        StringBuffer values = new StringBuffer();
        while (matcher.find()) { 
   
            String key = matcher.group(1);
            Object value = PropertyUtils.getProperty(data, key);
            Assertions.notNull(value, String.format("占位符未匹配到数据:%s", key));
            //解决:Illegal group reference 对字符串value进行 encode 防止value中有 $ 符号导致的替换异常
            matcher.appendReplacement(values, JsonUtils.toJson(value).replaceAll("\\$", "RDS_CHAR_DOLLAR"));
        }
        matcher.appendTail(values);
        return values.toString();
    }

注意

这里在使用jackson过程中遇到过一个坑,就是使用jackson api,用toJson() 方法转换下面这种格式的数据:

"{\"name\": \"zhangfei\"}___xxxx"

“{“test”:“name”}___xxxxx” 使用Jackson时会将 ___xxxxx字符截取掉(Jackson默认会使用 } 结尾作为结尾的符号,然后丢弃掉后面的数据),就会导致这个字符串也是一个合法的json,包括后续使用parse() 进行转换

解决方案
public static boolean isJson(@NotNull ObjectMapper mapper, String jsonInString) { 
   
       if (StringUtils.isEmpty(jsonInString)) { 
   
           return false;
       }
       try { 
   
       	//jackson在读取到不是标准的json时会抛出错误,则不是json格式
           JsonNode jsonNode = mapper.readTree(jsonInString);
           //在读取json完之后,判断读取完的字符串是否跟原来字符串相同,如果不相同就判断为false
           String jStr = jsonNode.toString();
           // trimAllWhitespace() 去掉所有的空格符号
           return StringUtils.trimAllWhitespace(jStr).equals(StringUtils.trimAllWhitespace(jsonInString));
       } catch (IOException e) { 
   
           return false;
       }
   }


public static String toJson(ObjectMapper mapper, Object object, boolean pretty) { 
   
       if (object == null) { 
   
           return StringPool.EMPTY_JSON;
       }
       // 如果是 string, 先转为 object 再转为 json, 避免转义字符
       if (object instanceof String) { 
   
           String str = StringUtils.trimWhitespace((String) object);
           //在执行toJson的时候会先判断是否是标准的json格式,如果不是就按照字符串的方式返回
           if (isJson(mapper, str)) { 
   
               object = parse(str, Object.class);
           } else { 
   
               // 非 json 字符串, 直接返回原始字符串
               return str;
           }
       }

       try { 
   
           String json;
           if (pretty) { 
   
               json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
           } else { 
   
               json = mapper.writeValueAsString(object);
           }
           return json;
       } catch (JsonProcessingException e) { 
   
           throw Exceptions.unchecked(e);
       }
   }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196097.html原文链接:https://javaforall.net

(0)
上一篇 2025年10月3日 下午6:15
下一篇 2025年10月3日 下午6:43


相关推荐

  • 调和函数与全纯函数

    调和函数与全纯函数全纯函数的实部和虚部是调和函数 这是很显然的 自然的要问一个问题 如果 u 是区域 D 上的调和函数 那么是否一定存在一个函数 f inH D 使得 rmRe f u 成立呢 一般来讲这个结论不对的 但是如果限制区域 D 是单连通的 那么结论就对了 下面给出这个结论的证明 注意到 Deltau 0 而且 D 单连通 从而 u y rmd x

    2026年3月18日
    3
  • 手机的分辨率和电脑的分辨率_手机屏幕分辨率大全

    手机的分辨率和电脑的分辨率_手机屏幕分辨率大全电脑分辨率分辨率比例是否淘汰1920*108016:9主流1366*76816:9主流1600*90016:9非主流2560*160016:10非主流1920*120016:10非主流1440*90016:10非主流1680*105016:10非主流1024*7684:3非主流800*6004:3非主流比例=高度/宽度手机分辨率ios型号分辨率像素密度(pp…

    2022年8月13日
    10
  • 三门问题(蒙提霍尔悖论)

    三门问题(蒙提霍尔悖论)三门问题分析蒙提霍尔问题 又称三门悖论 出自美国的一档电视节目 问题的描述是这样的 选手甲面前有三扇门 其中一扇门之后是汽车 其余两扇后面是山羊 选手可以选择三扇门中的任意一个并且打开后获得该扇门后面的东西 当选手选择了一扇门 但尚未去打开它的时候 主持人 事先知道每个门之后藏的东西 会在剩下的两扇门中打开一扇藏有山羊的门 并询问选手是否要更换 选择另一扇仍然关着的门 据说节目一经播出就引起

    2026年3月17日
    2
  • canda常用命令

    canda常用命令主要分为管理环境的命令和管理包的命令 管理环境 env 的命令 1 env name 环境名 2 exit env name 已存在的环境名 3 创建 python 版本环境 condacreatna namepython python3 6 condacreaten 3 6 创建一个名为 python34 的环境

    2026年3月20日
    2
  • java 异常分类和处理机制

    java 异常分类和处理机制一、背景介绍程序在运行过程中发生错误或异常情况是不可避免的,如果每一个运行时错误都由程序员手动控制和处理,其工作量是不可想象的。Java语言中的异常处理机制就解决的上述问题,把错误与异常的管理带到了面向对象的世界Java语言定义了很多异常类,将运行错误和异常的信息和处理方法封装在了异常类中,帮助程序员检查和控制异常。即J…

    2022年5月13日
    49
  • check the manual that corresponds to your MySQL server version for the right syntax to use near

    check the manual that corresponds to your MySQL server version for the right syntax to use near

    2021年7月15日
    86

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号