yaml文档读取

简介: yml文件操作

pom依赖

<dependency>
	<groupId>org.yaml</groupId>
	<artifactId>snakeyaml</artifactId>
	<version>1.17</version>
</dependency>

<dependency>
	<groupId>com.fasterxml.jackson.dataformat</groupId>
	<artifactId>jackson-dataformat-yaml</artifactId>
	<version>2.9.7</version>
</dependency>

工具代码


package com.donfaquir.axe.zk.yaml;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.yaml.snakeyaml.Yaml;

import java.util.Map;

/**
 * @author: 
 * @description: 使用snakeyaml框架读取yaml文件
 * @date Create in 2018/12/28 15:08
 * @modified By:
 */
@SuppressWarnings("unchecked")
public class SnakeYaml {
    private static Logger log = LoggerFactory.getLogger(SnakeYaml.class);

    /** 查询路径分隔符,类似:dubbo.registry.address */
    private static final String SEPARATOR = ".";
    /** 文件路径 */
    private String filePath;
    /** yaml文件操作入口 */
    private Yaml yaml;
    /** 标识是否创建Yaml实例 */
    private Boolean isInit;

    public SnakeYaml(String filePath){
        this.filePath = filePath;
        this.yaml = new Yaml();
        this.isInit = true;
    }

    /**
     * 根据key值路径,获取指定字符串的值
     * <p>
     * 在yaml文件中,形如:
     * <blockquote><pre>
     * first:
     *   second:
     *     third: value
     * </pre></blockquote>
     * 可以通过下面的调用方式获取"value"
     * <blockquote><pre>
     * String str = get("first.second.third");
     * </pre></blockquote>
     * 最多支持层级为五层;更深层的数据无法通过该方法获取,会返回key路径。
     * 层级高于五层,可以调用 {@link SnakeYaml#getYamlObject()} 获取配置文件得Object对象,手动封装获取
     *
     * @param keyPath   取值的key路径
     * @return          返回对应的值
     */

    public Object get(String keyPath){
        if(null == keyPath || !this.isInit){
            return null;
        }

        //如果给定的取值路径是多级路径,
        //只支持最多五级路径
        String[] keys;

        if(keyPath.contains(SEPARATOR)){
            keys = keyPath.split("\\.");
        }else{
            return getFirstOrderValue(keyPath);
        }
        return getValue(yaml.load(this.getClass().getClassLoader().getResourceAsStream(this.filePath)), keys, keys.length);
    }

    /**
     * 获取值
     * 如果key路径中只有一层,直接获取值
     * 如果key路径中有多层,会多次调用该方法,判断路径中的key是否有对应的值,也就是进行非空判断
     * @param load  yaml文件加载对象
     * @param keys  key路径中的值组成的数组
     * @param step  key路径中的层数
     * @return      获取的值
     */
    private Object getValue(Object load,String[] keys,int step){
        if(null == load || null == keys){
            return null;
        }
        if(step > keys.length){
            return null;
        }
        switch (step){
            case 1:
                Map<String, Object> load1 = (Map<String, Object>) load;
                return load1.get(keys[0]);
            case 2:
                Object load22 = getValue(load,keys,1);
                if(null != load22){
                    Map<String, Object> load2 = (Map<String, Object>) load22;
                    return load2.get(keys[1]);
                }
                return null;
            case 3:
                Object load33 = getValue(load,keys,2);
                if(null != load33){
                    Map<String, Object> load3 = (Map<String, Object>) load33;
                    return load3.get(keys[2]);
                }
                return null;
            case 4:
                Object load44 = getValue(load,keys,3);
                if(null != load44){
                    Map<String, Object> load4 = (Map<String, Object>) load44;
                    return load4.get(keys[3]);
                }
                return null;
            case 5:
                Object load55 = getValue(load,keys,4);
                if(null != load55){
                    Map<String, Object> load5 = (Map<String, Object>) load55;
                    return load5.get(keys[4]);
                }
                return null;
            default:
                return null;
        }
    }


    /**
     * 获取yaml文件中,第一层key对应的值
     * @param keyName       key值
     * @return              对应的value
     */
    public Object getFirstOrderValue(String keyName){
        if(keyName == null){
            return null;
        }
        if(keyName.contains(SEPARATOR)){
            this.get(keyName);
        }
        Map<String, Object> load = (Map<String, Object>) yaml.load(this.getClass().getClassLoader().getResourceAsStream(this.filePath));
        return load == null ? null : load.get(keyName);
    }

    /**
     * 如果获取数据的层级大于5级,调用此方法获取文件的Object对象
     * 用户手动获取对应数据
     * @return              文件的Object对象
     */
    public Object getYamlObject(){
        return yaml.load(this.getClass().getClassLoader().getResourceAsStream(this.filePath));
    }

    /**
     * 封装成指定的实例对象
     * @param clazz         实例类型
     * @param <T>           占位符
     * @return              实例对象
     */
    public <T> T getObjectsFromYaml(Class<T> clazz){
        return yaml.loadAs(this.getClass().getClassLoader().getResourceAsStream(this.filePath), clazz);
    }




}


目录
相关文章
|
XML JSON Kubernetes
在 Node.js 中使用 Yaml 编写API文档
在文章《使用Node.js、MongoDB、Fastify 构建API服务》中介绍使用 Swagger 构建 API 文档,编写文档不是那么的顺手,本文介绍另一种编写 API 文档的方式,即使用 Yaml ,将API文档与其实现完全分开。
361 0
在 Node.js 中使用 Yaml 编写API文档
|
网络协议 应用服务中间件 nginx
K8S-网络模型、POD/RC/SVC YAML 语法官方文档
K8S-网络模型、POD/RC/SVC YAML 语法官方文档 Kubernetes - Production-Grade Container Orchestrationkubernetes/kubernetes: Production-Grade Container Scheduling an.
1544 0
|
4月前
|
机器学习/深度学习 数据可视化 计算机视觉
YOLOv5改进 | 2023Neck篇 | 轻量级跨尺度特征融合模块CCFM(附yaml文件+添加教程)
YOLOv5改进 | 2023Neck篇 | 轻量级跨尺度特征融合模块CCFM(附yaml文件+添加教程)
587 1
|
3月前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
23天前
|
机器学习/深度学习 计算机视觉 Python
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
深度学习项目中在yaml文件中定义配置,以及使用的python的PyYAML库包读取解析yaml配置文件
31 0
|
23天前
|
JSON Kubernetes 数据格式
k8s集群yaml文件方式迁移
k8s集群yaml文件方式迁移
|
2月前
|
运维 Kubernetes Serverless
Serverless 应用引擎使用问题之s.yaml文件中如何使用外部环境变量
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
2月前
|
存储 缓存 运维
函数计算产品使用问题之如何将外部环境变量放到s.yaml文件中使用
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
28天前
|
Kubernetes API 容器
在K8S中,deployment的yaml文件如何编写呢?
在K8S中,deployment的yaml文件如何编写呢?
|
2月前
|
缓存 Serverless API
函数计算产品使用问题之没有s.yaml文件,修改代码如何重新部署
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。

热门文章

最新文章