yaml解析工具类(java)

3,347 阅读3分钟

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

山有峰顶,海有彼岸,漫漫长路,终有回转,余味苦涩,终会有回甘。别被眼前的磨难打败了,或许光明就在你放弃前的那一刻。带着愉快的心情做一个愉快的梦,醒来后,又是新的一天。

简介

这是基于snakeyaml实现的一个读取yaml配置的工具类. 主要功能是获取指定层级之下的数据.

我不知道当初为什么写这个类了,但是我知道,我要是不把他发出来我就是白写了😂

主要功能和使用方法

demo.yml

  zdc:
   config:
       key: value
       list:
         - 张三
       - 李四
       map:
         - name: 张三map
           age: 12
         - name: 李四map
           age: 121
  1. 支持获取指定层级之后的内容,并返回Map形式或Obj形式 new ConfigBean("指定文件").prefix("zdc.config").getMap()

new ConfigBean("指定文件").prefix("zdc.config").getObj()

  1. 支持获取指定层级之后的对象数据,并格式化为指定类,如"zdc.config" : new ConfigBean("指定文件").prefix("zdc.config").getT(A.class)

  2. 支持获取list中指定数据,如"zdc.config.list.1" : new ConfigBean().prefix("zdc.config.list.1").getObj()

  3. 支持获取list中指定数据之后的数据,如"zdc.config.map.1.name"

    new ConfigBean().prefix("zdc.config.list.1").getString()

具体代码

需要的maven包

<dependency>
 <groupId>org.yaml</groupId>
      <artifactId>snakeyaml</artifactId>
      <version>1.25</version>
 </dependency>
<dependency>
    <groupId>commons-beanutils</groupId>
    <artifactId>commons-beanutils-core</artifactId>
    <version>1.8.3</version>
</dependency>

java代码

package zdc.utils;

import org.apache.commons.beanutils.BeanUtils;
import org.yaml.snakeyaml.Yaml;

import java.io.InputStream;
import java.util.List;
import java.util.Map;

/**
 * 读取resources下的yaml配置类
 *
 *使用的maven包
 *  <dependency>
 *       <groupId>org.yaml</groupId>
 *       <artifactId>snakeyaml</artifactId>
 *       <version>1.25</version>
 *  </dependency>
 *  map->bean使用此包
 *  <dependency>
 *       <groupId>commons-beanutils</groupId>
 *       <artifactId>commons-beanutils-core</artifactId>
 *       <version>1.8.3</version>
 *  </dependency>
 *
 *使用方法
 *eg:
 *  zdc:
 *   config:
 *       key: value
 *       list:
 *         - 张三
 *         - 李四
 *       map:
 *         - name: 张三map
 *           age: 12
 *         - name: 李四map
 *           age: 121
 *
 *支持获取指定层级之后的数据,如"zdc.config" : new ConfigBean().prefix("zdc.config").getObj()
 *
 *支持获取list中指定数据,如"zdc.config.list.1" : new ConfigBean().prefix("zdc.config.list.1").getObj()
 *
 *支持获取list中指定数据之后的数据,如"zdc.config.map.1.name" :new ConfigBean().prefix("zdc.config.list.1").getString()
 *
 * @author ZDC
 */
public class ConfigBean {

    /**
     * 读取的资源名
     */
    private String fileName ="application.yml";
    /**
     * 获取的对象
     */
    private Object temp;


    /**
     * 创建一个资源获取对象,默认获取resources下的application.yml文件
     */
    public ConfigBean() {
        this.load();
    }

    /**
     * 创建一个资源获取对象,默认获取resources下的fileName文件
     * @param fileName
     */
    public ConfigBean(String fileName) {
        this.fileName =fileName;
        this.load();
    }

    /**
     * 加载指定的文件
     */
    private ConfigBean load() {
        Yaml yaml = new Yaml();
        InputStream inputStream = this.getClass()
                .getClassLoader()
                .getResourceAsStream(this.fileName);
        this.temp= yaml.load(inputStream);
        return this;
    }



    /**
     * eg "zdc.config.list"
     * eg ""
     * @param prefix
     */
    public ConfigBean prefix(String prefix){

        if(prefix==null || "".equals(prefix.trim())){
            return this;
        }
        //获取层级关系
        String[] keys = prefix.trim().split("\\.");
        for (String key : keys) {
            //判断数据类型
            if(this.temp instanceof Map){
                this.temp= ((Map) this.temp).get(key);
            }
            else if(this.temp instanceof List){
                if (isNumeric(key)) {
                    this.temp= ((List) this.temp).get(Integer.parseInt(key));
                }else{
                    throw new RuntimeException(String.format("当前层级类型为List,不能使用[%s]获取子集数据",key));
                }
            }else{
                throw new RuntimeException("暂时没有解析该类型或不支持再次解析");
            }
        }
        return this;
    }

    /**
     * 返回对象类型的数据,可能是List,Map,Obj
     * @return
     */
    public Object getObj(){
       return this.temp;
    }

    /**
     * 返回Map类型的数据
     * @return
     */
    public Map getMap()  {
     if(this.temp instanceof  Map){
         return (Map)this.temp;
     }
     return null;
    }

    /**
     * 返回List类型的数据
     * @return
     */
    public List getList()  {
        if(this.temp instanceof  List){
            return (List)this.temp;
        }
        return null;
    }

    /**
     * 返回对象类型数据,如果集成其他类库可以直接调用其他类库的map2bean方法 该处引用的是 commons-beanutils-core ,可以根据自己本地环境替换
     *
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T getT(Class<T> clazz) throws Exception {
        T obj = clazz.newInstance();
        Map map = this.getMap();
        BeanUtils.populate(obj,map);
        return obj;
    }

    /**
     * 返回String类型的数据
     * @return
     */
    public String getString()  {
        return this.temp==null ? "":this.temp.toString();
    }

    /**
     * 返回Integer类型的数据
     * @return
     */
    public Integer getInteger()  {
        String string = getString();
       return string!=null? Integer.parseInt(string):null;
    }

//TODO 可以自定也解析其他类型



    /**
     * 判断是否是数字
     * @param cs
     * @return
     */
    public static boolean isNumeric(final CharSequence cs) {
        if (cs == null || cs.length() == 0) {
            return false;
        }
        final int sz = cs.length();
        for (int i = 0; i < sz; i++) {
            if (!Character.isDigit(cs.charAt(i))) {
                return false;
            }
        }
        return true;
    }


}


这个系列的文章,总体来说是一些杂乱的记录.

其中的内容可能是在之前某个需要的时候记录下来的,当时需要,当时很有用.

但是在后续更多的时间里,他被封禁到了小角落.

你看不看,他都在那里,他并非一无是处.

你看到这里就给个三连吧

    作者:ZOUZDC
    链接:https://juejin.cn/post/7028963866063306760
    来源:稀土掘金
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。