• Java实现JSON{参数}占位符名称替换指定的多个变量值


    前言

    Java实现占位符名称替换值

    占位符现在应该说是比较流行的动态赋值,本文主要介绍了Java占位符名称替换值,根据一串带着参数名占位符的url,替换掉对应参数名的值

    问题1

    如果有这样一个字符串

     String info="我叫{0},我爱吃{1},我今年{2}岁";
    
    • 1

    你会怎么处理这个问题呢?

    解决方案

    这是一个比较简单的Java占位符操作

    我们可以使用 MessageFormat.format去操作,用他去转换(替换占位符)

    完整代码如下

    package com.wyh.utils;
    
    import java.text.MessageFormat;
    
    /**
     * @description: 测试占位符
     * @author: 魏一鹤
     * @createDate: 2022-08-08 21:45
     **/
    
    public class Test {
        public static void main(String[] args){
            String info="我叫{0},我爱吃{1},我今年{2}岁";
            System.out.println(MessageFormat.format(info, "张三丰", "火锅", "18"));
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    运行结果如下,没有问题,有的复杂点的可能需要用过’'去进行转义
    在这里插入图片描述

    问题2

    上述说的是最简单的一种转义,如果业务复杂点呢,比如有的模板就喜欢用这种占位符

    比如我们通常会使用这种方式,用变量来做占位符

     String info="我叫{name},我爱吃{food},我今年{age}岁";
    
    
    • 1
    • 2

    这个时候再用上面的解决方式还行吗,测试下

    很明显是不行的,直接就报错
    在这里插入图片描述

    Exception in thread “main” java.lang.IllegalArgumentException: can’t parse argument number: name

    在这里插入图片描述
    报错的原因很简单,无法解析参数占位符,这个时候怎么办呢?别急 继续看

    解决方案

    我们写一个专门的工具类,用来替换掉对应参数名的值

    工具类代码如下

    package com.hmdp.utils;
    
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    /**
     * @description: 替换参数占位符工具类
     * @author: 魏一鹤
     * @createDate: 2022-08-08 22:02
     **/
    
    public class StringFormatUtil {
        private static final Pattern pattern = Pattern.compile("\\{(.*?)\\}");
        private static Matcher matcher;
        
    
        /**
         * 格式化字符串 字符串中使用{key}表示占位符
         *
         * @param sourStr
         *            需要匹配的字符串
         * @param param
         *            参数集
         * @return
         */
        public static String format(String sourStr, Map<String, Object> param) {
            String tagerStr = sourStr;
            if (param == null)
                return tagerStr;
            try {
                matcher = pattern.matcher(tagerStr);
                while (matcher.find()) {
                    String key = matcher.group();
                    String keyclone = key.substring(1, key.length() - 1).trim();
                    Object value = param.get(keyclone);
                    if (value != null)
                        tagerStr = tagerStr.replace(key, value.toString());
                }
            }catch (Exception e){
                return null;
            }
            return tagerStr;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    然后再次测试,使用我们工具类里面的方法进行转化参数占位符

    package com.hmdp.utils;
    
    import java.util.HashMap;
    
    /**
     * @description: 测试转义符
     * @author: 魏一鹤
     * @createDate: 2022-08-08 21:57
     **/
    
    public class Test2 {
       public static void main(String[] args){
           // 需要解析的字符串
           String info="我叫{name},我爱吃{food},我今年{age}岁";
           // 把全局的参数占位符放到map中进行解析
           HashMap<String,Object> map = new HashMap();
           map.put("name","张三");
           map.put("food","西红柿");
           map.put("age","100");
           System.out.println(StringFormatUtil.format(info, map));
       }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    发现结果正是我们想要的

    在这里插入图片描述
    以上就是解决占位符的解决方式

    欢迎大家评论留言,如果此文能够帮助到大家,那就是对我最大的鼓励!

  • 相关阅读:
    ChatGPT,AIGC 数据库应用 Mysql 常见优化30例
    毕业设计-基于机器视觉的银行卡号识别系统
    西门子智能电气阀门定位器在冶金生产控制的应用
    套接字介绍
    Linux下kibana的安装与配置
    概述Linux内核驱动之GPIO子系统API接口
    代理IP与Socks5代理的技术奇妙之旅
    各省市ZF工作BG环境规制环境词汇词频分析(2009-2019年)
    HTTP【总结】
    [附源码]java毕业设计大学新生军训管理系统
  • 原文地址:https://blog.csdn.net/weixin_46713508/article/details/126232846