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);
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • eclipse code templates

    eclipse code templates

  • datax(5):改造升级-自动识别py环境,执行datax任务

    datax(5):改造升级-自动识别py环境,执行datax任务1思考上篇文章已经研究过datax.py文件,产生2个问题:如果用户不是py2环境(datax默认要求环境)怎么处理;能不能有一个脚本自动识别用户的py环境,从而执行datax任务2效果在py2或py3下执行下面命令>pythondatax.py../job/job.json熟悉的配方,熟悉的味道。什么都没有变,但是背后却做了很多事情;3改造过程3.1编写py3的datax脚本共计3个文件===datax.py文件===#!/usr/bin/envpyt.

  • MFC 键盘钩子「建议收藏」

    MFC 键盘钩子「建议收藏」一、前言一日,看见我妈正在用电脑练习打字,频频低头看键盘,我想:要是键盘能发音的话,不就可以方便她养成”盲打”的好习惯吗?光想不做可不行,开始行动(您可千万别急着去拿工具箱啊^_^)…按键能发音,其关键就是让程序能够知道当前键盘上是哪个键被按下,并播放相应的声音,自己的程序当然不在话下,那么其它程序当前按下哪个键如何得知呢?利用键盘钩子便可以很好地解决。下载本文的全部源代码大

  • 一致性(Consistency),可用性(Avilable),分区容错性(Tolerance of network Partition)

    一致性(Consistency),可用性(Avilable),分区容错性(Tolerance of network Partition)网络摘抄理解:一致性:读操作总是能读取到之前完成的写操作结果,满足这个条件的系统称为强一致系统,这里的“之前”一般对同一个客户端而言;可用性:读写操作在单台机器发生故障的情况下仍然能够正常执行,而不需要等待发生故障的机器重启或者其上的服务迁移到其他机器;分区可容忍性:机器故障、网络故障、机房停电等异常情况下仍然能够满足一致性和可用性。自己的理解:一致性:如下图1中所示,Clie

  • 极大似然估计和贝叶斯估计的联系(似然估计和最大似然估计)

    1.什么是参数在机器学习中,我们经常使用一个模型来描述生成观察数据的过程。例如,我们可以使用一个随机森林模型来分类客户是否会取消订阅服务(称为流失建模),或者我们可以用线性模型根据公司的广告支出来预测公司的收入(这是一个线性回归的例子)。每个模型都包含自己的一组参数,这些参数最终定义了模型本身。我们可以把线性模型写成y=mx+c的形式。在广告预测收入的例子中,x可以表示广告支…

  • .NET设计模式(11):组合模式(Composite Pattern)

    .NET设计模式(11):组合模式(Composite Pattern)

发表回复

您的电子邮箱地址不会被公开。

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