解析yml文件 转换 Map

起因

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

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

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

{
  "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()) {
            // 获得key
            String 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));
        // 递归解析Map
        testMap = JsonUtil.json2propMap(jsonObject);
        System.out.println(JsonUtil.toJson(testMap));
    }

在Java中解析YML(YAML)配置文件,可以使用第三方库SnakeYAML来实现。SnakeYAML是一个流行的Java库,用于读取和写入YAML数据。 首先,需要在Java项目中导入SnakeYAML库的依赖。可以通过Maven或Gradle等构建工具来添加SnakeYAML的依赖项。 接下来,可以使用SnakeYAML提供的API来解析YML配置文件。主要步骤包括读取YML文件、将其转换为Java对象以及访问其中的配置项。 以下是一个简单的示例代码,演示了如何使用SnakeYAML解析YML配置文件: ```java import org.yaml.snakeyaml.Yaml; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Map; public class YmlParser { public static void main(String[] args) { Yaml yaml = new Yaml(); try (InputStream inputStream = new FileInputStream("config.yml")) { Map<String, Object> obj = yaml.load(inputStream); // 访问配置项,如: String value = (String) obj.get("key"); System.out.println(value); } catch (IOException e) { e.printStackTrace(); } } } ``` 在示例中,首先创建一个Yaml对象。然后,通过使用FileInputStream加载YML文件,并使用load()方法将其转换为Java对象。最后,可以通过访问该对象中的配置项来获取配置值。 请注意,示例中的"config.yml"是YML文件的路径,你需要根据实际的文件路径进行修改。 通过上述步骤,就可以使用Java解析YML配置文件,并从中获取配置项的值。使用SnakeYAML库可以轻松地读取和处理YML文件,方便在Java项目中使用YML作为配置文件的格式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值