将有层次的Map转换为Properies对象

概要

  在使用snakeyaml读取yaml格式的配置文件后,可以将yaml转换为Map;当然你也可以转换为Bean,但是在定义Bean的时候需要按照yaml文件原有层次来定义,这样一旦配置文件改变需要从头更改相应的Bean的结构,会很麻烦。
  我们可以将Map转换成Properties的对象,然后适当的重写一下Properties类,让其支持数组即可,如果你的yaml配置文件中没有数组,则可以不用重写。

重写Properties

 下面已经将Map转Properties的方法在重写的Properties中实现:


public class QProperties extends Properties {
    /**
     * 加载有N级层次的map,将其转换为properties
     * @param pMap
     * @param preKey
     */
    public void loadMap(Map pMap,String preKey){
        if(pMap != null && pMap.size() > 0){

            Set keys = pMap.keySet();
            for(String key : keys){

                Object value = pMap.get(key);
                if(Map.class.isAssignableFrom(value.getClass())){
                    if(preKey == null || preKey.contentEquals("")){
                        loadMap((Map) value,(key));
                    }else{
                        loadMap((Map) value,(preKey + "." + key));
                    }
                }else{
                    if(preKey == null || preKey.contentEquals("")){
                        this.put(key,toString(value));
                    }else {
                        this.put(preKey + "." + key,toString(value));
                    }
                }
            }
        }
    }

    /**
     * 将Map中的value值转成字符串存储
     * @param value
     * @return
     */
    public String toString(Object value){
        return String.valueOf(value);
    }

}