java工具之解析yaml文件

  • 2020 年 2 月 26 日
  • 筆記

工具使用背景

很多配置項都是使用yaml的格式進行配置的, 按一定的格式進行縮進, 一眼看上去,清晰明了.

如Springboot工程下圖所示:

如:k8s的Deploy文件:

本次寫這個yaml工具解析是想解析k8s的config文件,然後封裝一個k8s客戶端. 因為無論阿里雲還是華為雲,要查看多個容器的日誌. 都不是方便.

基礎依賴

這個工具是在已有的工具上進行封裝的

gradle:

compile group: 'org.yaml', name: 'snakeyaml', version: '1.25'

maven:

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

封裝的代碼

  // 首先聲明一個Map存解析之後的內容:  Map<String, Object> properties;        // 空的構造函數      public YamlTools() {      }      // 以文件路徑為條件的構造函數      public YamlTools(String filePath) {          InputStream inputStream = null;          try {              inputStream = new FileInputStream(filePath);          } catch (FileNotFoundException e) {              e.printStackTrace();          }        // 調基礎工具類的方法          Yaml yaml = new Yaml();          properties = yaml.loadAs(inputStream, Map.class);      }        // 從String 中獲取配置的方法      public void initWithString(String content) {          // 這裡的yaml和上面那個應該可以抽取成一個全局變量,不過平常用的時候          // 也不會兩個同時用          Yaml yaml = new Yaml();          properties = yaml.loadAs(content, Map.class);      }          /**       * 從Map中獲取配置的值       * 傳的key支持兩種形式, 一種是單獨的,如user.path.key       * 一種是獲取數組中的某一個,如 user.path.key[0]       * @param key       * @return       */      public <T> T getValueByKey(String key, T defaultValue) {          String separator = ".";          String[] separatorKeys = null;          if (key.contains(separator)) {              // 取下面配置項的情況, user.path.keys 這種              separatorKeys = key.split("\.");          } else {              // 直接取一個配置項的情況, user              Object res = properties.get(key);              return res == null ? defaultValue : (T) res;          }          // 下面肯定是取多個的情況          String finalValue = null;          Object tempObject = properties;          for (int i = 0; i < separatorKeys.length; i++) {              //如果是user[0].path這種情況,則按list處理              String innerKey = separatorKeys[i];              Integer index = null;              if (innerKey.contains("[")) {                  // 如果是user[0]的形式,則index = 0 , innerKey=user                  index = Integer.valueOf(StringTools.getSubstringBetweenFF(innerKey, "[", "]")[0]);                  innerKey = innerKey.substring(0, innerKey.indexOf("["));              }              Map<String, Object> mapTempObj = (Map) tempObject;              Object object = mapTempObj.get(innerKey);            // 如果沒有對應的配置項,則返回設置的默認值            if (object == null) {                  return defaultValue;              }              Object targetObj = object;              if (index != null) {                  // 如果是取的數組中的值,在這裡取值                  targetObj = ((ArrayList) object).get(index);              }              // 一次獲取結束,繼續獲取後面的              tempObject = targetObj;              if (i == separatorKeys.length - 1) {                  //循環結束                  return (T) targetObj;              }            }          return null;      }

運行效果

以上圖中的K8s為例,運行如下圖所示:

總結

一個小工具, 根據自己的需求封裝了一下,大家也可以定製自己的工具