zl程序教程

您现在的位置是:首页 >  后端

当前栏目

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

JAVAJSONJSON 实现 参数 指定 多个 替换
2023-09-11 14:22:31 时间

前言

Java实现占位符名称替换值

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

问题1

如果有这样一个字符串

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

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

解决方案

这是一个比较简单的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"));
    }
}

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

问题2

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

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

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

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

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

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;
    }
}

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

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));
   }
}

发现结果正是我们想要的

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

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