• springboot中对yaml文件的解析


      一、YAML是“YAML不是一种标记语言”的外语缩写 (见前方参考资料原文内容);但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。

      二、在springboot中的基础配置是通过yaml的方式来解析实现,当然也支持xml的文件解析。这里主要是学习源码中了解到yaml的解析过程。帮助自己在学习源码的时候,判定spring做了哪些操作。

      三、yaml的配置文件

    server:
      port: 8080
    spring:
      datasource:
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/model?useUnicode=true&characterEncoding=utf-8
        username: root
        password: root
      jpa:
        show-sql: true
        hibernate:
          ddl-auto: update

      四、yaml的解析过程

    import org.springframework.core.io.Resource;
    import org.springframework.lang.NonNull;
    import org.springframework.lang.Nullable;
    import org.springframework.util.StringUtils;
    import org.yaml.snakeyaml.Yaml;
    import org.yaml.snakeyaml.reader.UnicodeReader;
    
    import java.io.IOException;
    import java.util.*;
    
    public class YamlUtils {
    
        /**
         * 单个yaml文件处理
         * @param resource
         * @return
         * @throws IOException
         */
        public static Map<String, Object> yamlHandler(@NonNull Resource resource) throws IOException {
            //返回的结果
            Map<String, Object> result = new LinkedHashMap<>();
            //读取方式
            UnicodeReader reader = new UnicodeReader(resource.getInputStream());
            //单文件处理
            Yaml yaml = new Yaml();
            Object object = yaml.load(reader);
            //这里只是简单处理,需要多个方式可以自己添加
            if (object instanceof Map) {
                Map map = (Map) object;
                buildFlattenedMap(result, map, null);
            }
            reader.close();
            return result;
        }
    
        /**
         * 单个yaml文件处理
         * @param resources
         * @return
         * @throws IOException
         */
        public static Map<String, Object> yamlHandler(@NonNull Resource[] resources) throws IOException {
    
            //返回的结果
            Map<String, Object> result = new LinkedHashMap<>();
            Yaml yaml = new Yaml();
            //多个文件处理
            Iterator<Resource> iterator = Arrays.stream(resources).iterator();
            while (iterator.hasNext()) {
                Resource resource = iterator.next();
                UnicodeReader reader = new UnicodeReader(resource.getInputStream());
                Object object = yaml.load(reader);
                //这里只是简单处理,需要多个方式可以自己添加
                if (object instanceof Map) {
                    Map map = (Map) object;
                    buildFlattenedMap(result, map, null);
                }
                reader.close();
            }
            return result;
        }
    
        /**
         * 这部分代码来至springboot源码部分对yaml的解析
         * YamlProcessor.java buildFlattenedMap方法
         * @param result
         * @param source
         * @param path
         */
        private static void buildFlattenedMap(Map<String, Object> result, Map<String, Object> source, @Nullable String path) {
            //循环读取原数据
            source.forEach((key, value) -> {
                //如果存在路径进行拼接
                if (StringUtils.hasText(path)) {
                    if (key.startsWith("[")) {
                        key = path + key;
                    } else {
                        key = path + '.' + key;
                    }
                }
                //数据类型匹配
                if (value instanceof String) {
                    result.put(key, value);
                } else if (value instanceof Map) {
                    //如果是map,就继续读取
                    Map<String, Object> map = (Map)value;
                    buildFlattenedMap(result, map, key);
                } else if (value instanceof Collection) {
                    Collection<Object> collection = (Collection)value;
                    if (collection.isEmpty()) {
                        result.put(key, "");
                    } else {
                        int count = 0;
                        Iterator var7 = collection.iterator();
    
                        while(var7.hasNext()) {
                            Object object = var7.next();
                            buildFlattenedMap(result, Collections.singletonMap("[" + count++ + "]", object), key);
                        }
                    }
                } else {
                    result.put(key, value != null ? value : "");
                }
            });
        }
    
    }

       五、测试

       public static void main(String[] args) throws IOException {
            Map<String, Object> map = YamlUtils.yamlHandler(new ClassPathResource("config/application.yaml"));
            System.out.println(map);
        }

      

  • 相关阅读:
    exe自启动的几种方式
    关于 CShellManager 的作用
    DLL 调用 对话框 以及 如何获取调用dll 应用程序(窗口程序)的窗口句柄
    VC++ 2010 创建高级Ribbon界面详解(4)
    HPU--1221 Fibonacci数列
    取一个数的前几位
    HDU--1875 畅通工程再续
    POJ--2485 Highways
    【模板】HDU--1233 畅通工程
    hdu--1856 More is better
  • 原文地址:https://www.cnblogs.com/ll409546297/p/9959418.html
Copyright © 2020-2023  润新知