起因

有一个需求是把一个yml文件解析成HashMap格式的数据,文件内容如下

spring:datasource:serviceDB:jdbc-url: jdbc:mysql://127.0.0.1:3306/serviceDBpassword: testminimum-idle: 1idle-timeout: 60000maximum-pool-size: 150username: rootcluster:- key: bijdbc-url: jdbc:mysql://127.0.0.1:3306/testpassword: testminimum-idle: 1idle-timeout: 60000maximum-pool-size: 150username: root- key: hisjdbc-url: jdbc:mysql://127.0.0.1:3306/hispassword: testminimum-idle: 1idle-timeout: 60000maximum-pool-size: 150username: rootconfig:schedul:onOff: falseorderGen:masterWorkerId: 1backupWorkerId: 2

解析得到的结果如下所示:

{"spring.datasource.serviceDB.jdbc-url": "jdbc:mysql://127.0.0.1:3306/serviceDB","spring.datasource.serviceDB.password": "test","spring.datasource.serviceDB.username": "root","spring.datasource.cluster[0].key": "bi","spring.datasource.cluster[1].maximum-pool-size": "150","config.schedul.onOff": "false","spring.datasource.cluster[0].password": "test","spring.datasource.cluster[0].maximum-pool-size": "150","spring.datasource.cluster[1].username": "root","spring.datasource.serviceDB.idle-timeout": "60000","config.orderGen.backupWorkerId": "2","spring.datasource.cluster[1].idle-timeout": "60000","spring.datasource.serviceDB.minimum-idle": "1","spring.datasource.cluster[0].username": "root","spring.datasource.cluster[1].key": "his","config.orderGen.masterWorkerId": "1","spring.datasource.cluster[0].minimum-idle": "1","spring.datasource.cluster[0].idle-timeout": "60000","spring.datasource.cluster[1].password": "test","spring.datasource.cluster[0].jdbc-url": "jdbc:mysql://127.0.0.1:3306/test","spring.datasource.serviceDB.maximum-pool-size": "150","spring.datasource.cluster[1].minimum-idle": "1","spring.datasource.cluster[1].jdbc-url": "jdbc:mysql://127.0.0.1:3306/his"
}

实现思路

第一步:使用yml读取文件

Yaml yaml = new Yaml();
Map<String, Object> testMap =  yaml.load( new BufferedReader(new FileReader("test.yml")));

但是此时得到的testMap不是我们想要的结果,testMap的内容如下:

{"spring":{"datasource":{"serviceDB":{"jdbc-url":"jdbc:mysql://127.0.0.1:3306/serviceDB","password":"test","minimum-idle":1,"idle-timeout":60000,"maximum-pool-size":150,"username":"root"},"cluster":[{"key":"bi","jdbc-url":"jdbc:mysql://127.0.0.1:3306/test","password":"test","minimum-idle":1,"idle-timeout":60000,"maximum-pool-size":150,"username":"root"},{"key":"his","jdbc-url":"jdbc:mysql://127.0.0.1:3306/his","password":"test","minimum-idle":1,"idle-timeout":60000,"maximum-pool-size":150,"username":"root"}]}},"config":{"schedul":{"onOff":false},"orderGen":{"masterWorkerId":1,"backupWorkerId":2}}}

第二步:得到testMap后需要进行进一步的解析,得到需要的结果,这个时候就要使用递归解析了,需要注意的是对于yml中数组的解析要重点处理

核心代码如下:

 /*** * @Title: json2propMap * @Description: 解析json 转换 Map* @param jsonObject* @return  * @throws **/public static Map<String, Object> json2propMap(JSONObject jsonObject){String tmpKey = "";String tmpKeyPre = "";Map<String, Object> configMap = new HashMap<String, Object>();json2prop(jsonObject, tmpKey, tmpKeyPre, configMap);return configMap;}/*** * @Title: json2prop * @Description: 递归解析* @param jsonObject* @param tmpKey* @param tmpKeyPre* @param configMap  * @throws **/private static void json2prop(JSONObject jsonObject, String tmpKey, String tmpKeyPre, Map<String, Object> configMap) {Iterator<String> iterator = jsonObject.keySet().iterator();while (iterator.hasNext()) {// 获得keyString key = iterator.next();String value = jsonObject.getString(key);Object valueObject = null;try {valueObject = JSONObject.parse(value);} catch (Exception e) {// 如果解析出错,就说明已经到头了,放入map然后继续解析configMap.put(tmpKey + key, value);continue;}// 如果是集合,需要特殊解析if (valueObject instanceof Collection<?>) {List<?> list = (List<?>)valueObject;tmpKeyPre = tmpKey;
//                tmpKey += key;for (int i = 0; i < list.size(); i++) {String itemKey = tmpKey + key + "["+i+"]" + ".";JSONObject itemValue = (JSONObject)list.get(i);json2prop(itemValue, itemKey, tmpKeyPre, configMap);}} else if (valueObject instanceof JSONObject) {JSONObject jsonStr = JSONObject.parseObject(value);tmpKeyPre = tmpKey;tmpKey += key + ".";json2prop(jsonStr, tmpKey, tmpKeyPre, configMap);tmpKey = tmpKeyPre;} else {configMap.put(tmpKey + key, value);continue;}}}

第三步:得到最终结果,终极代码如下:

public static void main(String[] args) throws FileNotFoundException {Yaml yaml = new Yaml();Map<String, Object> testMap = yaml.load( new BufferedReader(new FileReader("test.yml")));System.out.println(JsonUtil.toJson(testMap));JSONObject jsonObject = JSONObject.parseObject(JsonUtil.toJson(testMap));// 递归解析MaptestMap = JsonUtil.json2propMap(jsonObject);System.out.println(JsonUtil.toJson(testMap));}

解析yml文件 转换 Map相关推荐

  1. Go语言读取解析yml文件,快速转换yml到go struct

    YAML (YAML Ain't a Markup Language)是一种标记语言,通常以.yml为后缀的文件,是一种直观的能够被计算机程序识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交 ...

  2. python解析mht文件_php解析mht文件转换成html的方法

    本篇文章主要介绍php解析mht文件转换成html的方法,感兴趣的朋友参考下,希望对大家有所帮助. php解析mht文件,使用编辑器打开可以看到base64编码所以,mht是可以转换成html的. / ...

  3. php解析mht,php解析mht文件转换成html的实例

    php解析mht文件,使用编辑器打开可以看到base64编码所以,mht是可以转换成html的. /** * 针对Mht格式的文件进行解析 * 使用例子: * * function mhtmlPars ...

  4. python解析mht文件_php解析mht文件转换成html的实例详解

    下面小编就为大家带来一篇php解析mht文件转换成html的实例.小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 php解析mht文件,使用编辑器打开可以看到base64 ...

  5. php读取mht,php解析mht文件转换成html的实例

    php解析mht文件转换成html的实例 发布于 2017-08-07 07:27:31 | 116 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypertex ...

  6. java解析yml文件_如何基于JAVA读取yml配置文件指定key内容

    这篇文章主要介绍了如何基于JAVA读取yml配置文件指定key内容,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 先引入需要的依赖 org.yaml ...

  7. php解析mht,php解析mht文件转换成html

    php解析mht文件,使用编辑器打开可以看到base64编码所以,mht是可以转换成html的. /** * 针对Mht格式的文件进行解析 * 使用例子: * * function mhtmlPars ...

  8. @Value获取yml文件的map和json对象写法

    yml文件: serviceCodeToUrlList: '{"106":"https://h5-test.schengle.com/ShengDaPostalBank/ ...

  9. java解析yml文件_java读取解析application.yml

    java读取解析application.yml 不用依赖spring容器,可单独使用. bug已修改... 第一步.首先要2个jar com.fasterxml.jackson.dataformat ...

  10. DOM4J解析xml文件,递归遍历全部子节点

    业务需求是把图中的xml解析为如下格式的进行前端展示 ps:解析后用一个map来装,注意map的value是子节点名称,并不是节点值!!! map中的key为: 根节点名,用"-" ...

最新文章

  1. Notepad++写Verilog HDL代码时,在注释语句下出现红色波浪线怎么办?
  2. Merkle 树——空间换时间,分而治之的hash表,通过根节点是由它的两个子节点内容的哈希值组成来校验数据完整性,定位篡改的数据位置...
  3. poj 1932(spfa判断环)
  4. HTML5 高级系列:web Storage 学前端开发要先看这个
  5. 命令 启动顺序_笔记一: 启动选项与系统变量
  6. java对象模型 指令_深入理解多线程(二)—— Java的对象模型
  7. linux jenkins 插件,使用Jenkins Dashboard插件可视化部署,
  8. SAP License:如何用Coding Block
  9. linux下的shell脚本(基本)
  10. jetty服务器原理与maven集成
  11. 面试题总结——JAVA高级工程师
  12. 高光谱图像pca降维matlab_基于 SAE-LR 的高光谱分类
  13. 夏令时国家时间java代码_程序里的国际时区和夏令时
  14. nginx设置域名跳转另一个域名
  15. ARCore:ARCore的初体验
  16. 手机数据恢复华为荣耀X1智能手机32G内置存储手机严重损坏恢复照片聊天记录文档...
  17. 用mobx-react框架wukong撸个电影网站
  18. 当你学会炒菜的时候,你就学会了大数据
  19. 百分点大数据技术团队:低代码平台实践
  20. 关于LCD1602单独清除某一行的问题

热门文章

  1. python发邮件被认定为垃圾邮件_【python文本分类】20行代码识别垃圾邮件
  2. UCHome二次开发:uchome文件体系介绍
  3. cashfiesta广告与传销?
  4. ESP32 INMP441麦克风驱动
  5. 芯片数据手册下载和阅读
  6. ROS(ROUTEROS) 端口映射
  7. 【苹果iMessage家庭推送】软件安装群发推送通过HealthKit API访问NikeFuel
  8. 播布客里小布老师的全部视频收集
  9. Slic3r基础知识
  10. 产品经理如何写出一看就想约的简历