在线yml和properties相互转换
目前搜索到的大部分代码都存在以下问题:
- 复杂结构解析丢失
- 解析后顺序错乱
所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址
除了yml和properties互转之外,还可以生成代码、sql转json等,可以去用一下,用爱发电,感谢支持!
源码:
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.CollectionUtils;
import org.yaml.snakeyaml.Yaml;import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author Deng.Weiping* @since 2023/11/28 13:57*/
@Slf4j
public class PropertiesUtil {/*** yaml 转 Properties** @param input* @return*/public static String castToProperties(String input) {Map<String, Object> propertiesMap = new LinkedHashMap<>();Map<String, Object> yamlMap = new Yaml().load(input);flattenMap("", yamlMap, propertiesMap);StringBuffer strBuff = new StringBuffer();propertiesMap.forEach((key, value) -> strBuff.append(key).append("=").append(value).append(StrUtil.LF));return strBuff.toString();}/*** Properties 转 Yaml** @param input* @return*/public static String castToYaml(String input) {try {Map<String, Object> properties = readProperties(input);return properties2Yaml(properties);} catch (Exception e) {log.error("property 转 Yaml 转换失败", e);}return null;}private static Map<String, Object> readProperties(String input) throws IOException {Map<String, Object> propertiesMap = new LinkedHashMap<>(); // 使用 LinkedHashMap 保证顺序for (String line : input.split(StrUtil.LF)) {if (StrUtil.isNotBlank(line)) {// 使用正则表达式解析每一行中的键值对Pattern pattern = Pattern.compile("\\s*([^=\\s]*)\\s*=\\s*(.*)\\s*");Matcher matcher = pattern.matcher(line);if (matcher.matches()) {String key = matcher.group(1);String value = matcher.group(2);propertiesMap.put(key, value);}}}return propertiesMap;}/*** 递归 Map 集合,转为 Properties集合** @param prefix* @param yamlMap* @param treeMap*/private static void flattenMap(String prefix, Map<String, Object> yamlMap, Map<String, Object> treeMap) {yamlMap.forEach((key, value) -> {String fullKey = prefix + key;if (value instanceof LinkedHashMap) {flattenMap(fullKey + ".", (LinkedHashMap) value, treeMap);} else if (value instanceof ArrayList) {List values = (ArrayList) value;for (int i = 0; i < values.size(); i++) {String itemKey = String.format("%s[%d]", fullKey, i);Object itemValue = values.get(i);if (itemValue instanceof String) {treeMap.put(itemKey, itemValue);} else {flattenMap(itemKey + ".", (LinkedHashMap) itemValue, treeMap);}}} else {treeMap.put(fullKey, value.toString());}});}/*** properties 格式转化为 yaml 格式字符串** @param properties* @return*/private static String properties2Yaml(Map<String, Object> properties) {if (CollUtil.isEmpty(properties)) {return null;}Map<String, Object> map = parseToMap(properties);StringBuffer stringBuffer = map2Yaml(map);return stringBuffer.toString();}/*** 递归解析为 LinkedHashMap** @param propMap* @return*/private static Map<String, Object> parseToMap(Map<String, Object> propMap) {Map<String, Object> resultMap = new LinkedHashMap<>();try {if (CollectionUtils.isEmpty(propMap)) {return resultMap;}propMap.forEach((key, value) -> {if (key.contains(".")) {String currentKey = key.substring(0, key.indexOf("."));if (resultMap.get(currentKey) != null) {return;}Map<String, Object> childMap = getChildMap(propMap, currentKey);Map<String, Object> map = parseToMap(childMap);resultMap.put(currentKey, map);} else {resultMap.put(key, value);}});} catch (Exception e) {e.printStackTrace();}return resultMap;}/*** 获取拥有相同父级节点的子节点** @param propMap* @param currentKey* @return*/private static Map<String, Object> getChildMap(Map<String, Object> propMap, String currentKey) {Map<String, Object> childMap = new LinkedHashMap<>();try {propMap.forEach((key, value) -> {if (key.contains(currentKey + ".")) {key = key.substring(key.indexOf(".") + 1);childMap.put(key, value);}});} catch (Exception e) {e.printStackTrace();}return childMap;}/*** map集合转化为yaml格式字符串** @param map* @return*/public static StringBuffer map2Yaml(Map<String, Object> map) {//默认deep 为零,表示不空格,deep 每加一层,缩进两个空格return map2Yaml(map, 0);}/*** 把Map集合转化为yaml格式 String字符串** @param propMap map格式配置文件* @param deep 树的层级,默认deep 为零,表示不空格,deep 每加一层,缩进两个空格* @return*/private static StringBuffer map2Yaml(Map<String, Object> propMap, int deep) {StringBuffer yamlBuffer = new StringBuffer();try {if (CollectionUtils.isEmpty(propMap)) {return yamlBuffer;}String space = getSpace(deep);for (Map.Entry<String, Object> entry : propMap.entrySet()) {Object valObj = entry.getValue();if (entry.getKey().contains("[") && entry.getKey().contains("]")) {String key = entry.getKey().substring(0, entry.getKey().indexOf("[")) + ":";yamlBuffer.append(space + key + "\n");propMap.forEach((itemKey, itemValue) -> {if (itemKey.startsWith(key.substring(0, entry.getKey().indexOf("[")))) {yamlBuffer.append(getSpace(deep + 1) + "- ");if (itemValue instanceof Map) {StringBuffer valStr = map2Yaml((Map<String, Object>) itemValue, 0);String[] split = valStr.toString().split(StrUtil.LF);for (int i = 0; i < split.length; i++) {if (i > 0) {yamlBuffer.append(getSpace(deep + 2));}yamlBuffer.append(split[i]).append(StrUtil.LF);}} else {yamlBuffer.append(itemValue + "\n");}}});break;} else {String key = space + entry.getKey() + ":";if (valObj instanceof String) { //值为value 类型,不用再继续遍历yamlBuffer.append(key + " " + valObj + "\n");} else if (valObj instanceof List) { //yaml List 集合格式yamlBuffer.append(key + "\n");List<String> list = (List<String>) entry.getValue();String lSpace = getSpace(deep + 1);for (String str : list) {yamlBuffer.append(lSpace + "- " + str + "\n");}} else if (valObj instanceof Map) { //继续递归遍历Map<String, Object> valMap = (Map<String, Object>) valObj;yamlBuffer.append(key + "\n");StringBuffer valStr = map2Yaml(valMap, deep + 1);yamlBuffer.append(valStr.toString());} else {yamlBuffer.append(key + " " + valObj + "\n");}}}} catch (Exception e) {e.printStackTrace();}return yamlBuffer;}/*** 获取缩进空格** @param deep* @return*/private static String getSpace(int deep) {StringBuffer buffer = new StringBuffer();if (deep == 0) {return "";}for (int i = 0; i < deep; i++) {buffer.append(" ");}return buffer.toString();}}
相关文章:

在线yml和properties相互转换
目前搜索到的大部分代码都存在以下问题: 复杂结构解析丢失解析后顺序错乱 所以自己写了一个,经过不充分测试,基本满足使用。可以直接在线使用 在线地址 除了yml和properties互转之外,还可以生成代码、sql转json等,可…...

数据收集与处理(爬虫技术)
文章目录 1 前言2 网络爬虫2.1 构造自己的Scrapy爬虫2.1.1 items.py2.1.2 spiders子目录2.1.3 pipelines.py 2.2 构造可接受参数的Scrapy爬虫2.3 运行Scrapy爬虫2.3.1 在命令行运行2.3.2 在程序中调用 2.4 运行Scrapy的一些要点 3 大规模非结构化数据的存储与分析4 全部代码 1 …...

C# 雪花算法生成Id工具类
写在前面 传说自然界中并不存在两片完全一样的雪花的,每一片雪花都拥有自己漂亮独特的形状、独一无二;雪花算法也表示生成的ID如雪花般独一无二,该算法源自Twitter。 雪花算法主要用于解决分布式系统的唯一Id生成问题,在生产环境…...

什么是通配符证书?
通配符证书是一种特殊的数字证书,主要用于加密网站与用户之间的通信,以保证数据的私密性和完整性。它的独特之处在于可以使用一个单一的证书来保护无限数量的相关子域名。它使用通配符字符(*)作为占位符,代表任意子域名…...

西南科技大学模拟电子技术实验五(集成运算放大器的应用设计)预习报告
一、计算/设计过程 设计一:用集成运放设计一个输入为0.05v,放大为-100的反相比例运算电路。 对于理想电路,反相比例运算电路的输出电压与输入电压之间的关系如下: =-100,所以 =100 若是假定R1为100k,则R2= =1k 为了减小输入级偏置电流引起的运算误差,在同相输入端…...

LeetCode 每日一题 Day 4
2477. 到达首都的最少油耗 给你一棵 n 个节点的树(一个无向、连通、无环图),每个节点表示一个城市,编号从 0 到 n - 1 ,且恰好有 n - 1 条路。0 是首都。给你一个二维整数数组 roads ,其中 roads[i] [ai,…...

服务器数据恢复—重装系统导致XFS文件系统分区丢失的数据恢复案例
服务器数据恢复环境: 服务器使用磁盘柜RAID卡搭建了一组riad5磁盘阵列。服务器上层分配了一个LUN,划分了两个分区:sdc1分区和sdc2分区。通过LVM扩容的方式,将sdc1分区加入到了root_lv中;sdc2分区格式化为XFS文件系统。…...

Scala 从入门到精通
Scala 从入门到精通 数据类型 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http:…...

华为OD机试 - 九宫格按键输入 - 逻辑分析(Java 2023 B卷 200分)
目录 专栏导读一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2023B卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(A卷B卷&#…...

leetcode:225. 用队列实现栈
一、题目 链接:225. 用队列实现栈 - 力扣(LeetCode) 函数原型: typedef struct { } MyStack; MyStack* myStackCreate() void myStackPush(MyStack* obj, int x) int myStackPop(MyStack* obj) int myStackTop(MyStack* obj) …...

Centos7安装GItLab(在线版)
基础环境准备 1.配置清华大学镜像仓库 新建仓库配置文件使用 vim /etc/yum.repos.d/gitlab-ce.repo 命令,输入以下内容,保存 [gitlab-ce] nameGitlab CE Repository baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/ gpgcheck0 enabl…...

Linux入门笔记
1 Linux概述 Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心…...

nvm for windows使用与node/npm/yarn的配置
1 下载 nvm for windows download – github 下拉到Assets, 下载.exe文件 2 安装 安装到如下文件夹中 目录可以自己选, 可以换别的名字, 自己记住即可 新手建议全部看完再进行个人配置, 或者使用与博主一致的路径 D:\DevelopEnvironment\nvm3 配置nvm使用的镜像 node_mir…...

打工人副业变现秘籍,某多/某手变现底层引擎-StableDiffusionWebUI界面基本布局和操作
一、界面设置 文生图:根据文本提示生成图像 图生图:图像生成图像;功能很强大,自己在后续使用中探索。 后期处理:图片处理;功能很强大,自己在后续使用中探索。 PNG信息:这是一个快速获取图片生成参数的便捷功能。如果图像是在SD里生成的,您可以使用“发送到”按钮将…...

01、pytest:帮助你编写更好的程序
简介 pytest框架可以很容易地编写小型、可读的测试,并且可以扩展以支持应用程序和库的复杂功能测试。使用pytest至少需要安装Python3.7或PyPy3。PyPI包名称为pytest 一个快速的例子 # content of test_sample.py def inc(x):return x1def test_ansewer():asser…...

C语言--每日选择题--Day37
第一题 1. 有以下说明语句:则下面引用形式错误的是() struct Student {int num;double score; };struct Student stu[3] {{1001,80}, {1002,75}, {1003,91}} struct Student *p stu; A:p->num B:(p).num C&#…...

Android 12 及以上授权精确位置和模糊位置
请求位置信息权限 为了保护用户隐私,使用位置信息服务的应用必须请求位置权限。 请求位置权限时,请遵循与请求任何其他运行时权限相同的最佳做法。请求位置权限时的一个重要区别在于,系统中包含与位置相关的多项权限。具体请求哪项权限以及…...
scp 指令详细介绍
目录 1. 基本语法 2. 例子 从本地到远程 从远程到本地 从远程到远程 使用端口和指定私钥 递归复制目录 3. 注意事项 如何拷贝文件的软链接 SCP(Secure Copy Protocol)是一种用于在计算机之间安全地传输文件的协议。它通过加密的方式在网络上安全…...

构建第一个事件驱动型 Serverless 应用
我相信,我们从不缺精彩的应用创意,我们缺少的把这些想法变成现实的时间和付出。 我认为,无服务器技术真的有助于最大限度节省应用开发和部署的时间,并且无服务器技术用可控的成本,实现了我的那些有趣的想法。 在我 2…...
特征与特征图的区别
1.特征图是什么? 特征图是指在卷积神经网络中,通过卷积操作从输入图像中提取出来的图像特征。在卷积神经网络中,每一层的输出都是一个三维张量,其中第三维表示特征图的数量。每个特征图都是由若干个卷积核对上一层的特征图进行卷…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏
一、引言 在深度学习中,我们训练出的神经网络往往非常庞大(比如像 ResNet、YOLOv8、Vision Transformer),虽然精度很高,但“太重”了,运行起来很慢,占用内存大,不适合部署到手机、摄…...