java yaml文件与map转换工具类

import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.list.GrowthList;
import org.apache.commons.lang3.StringUtils;
import org.yaml.snakeyaml.Yaml;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

/**
 * @author kittlen
 * @date 2024-04-01 14:56
 * @description
 */

@Slf4j
@NoArgsConstructor(access = lombok.AccessLevel.PRIVATE)
public class YamlParserUtil {
    /**
     * yml文件流转成单层map
     * 转Properties 改变了顺序
     *
     * @param yamlContent
     * @return
     */
    public static Map<String, Object> yamlToFlattenedMap(String yamlContent) {
        Yaml yaml = createYaml();
        Map<String, Object> map = new HashMap<>();
        for (Object object : yaml.loadAll(yamlContent)) {
            if (object != null) {
                map = asMap(object);
                map = getFlattenedMap(map);
            }
        }
        return map;
    }

    /**
     * yml文件流转成多次嵌套map
     *
     * @param yamlContent
     * @return
     */
    public static Map<String, Object> yamlToMultilayerMap(String yamlContent) {
        Yaml yaml = createYaml();
        Map<String, Object> result = new LinkedHashMap<>();
        for (Object object : yaml.loadAll(yamlContent)) {
            if (object != null) {
                result.putAll(asMap(object));
            }
        }
        return result;
    }

    /**
     * 多次嵌套map转成yml
     *
     * @param map
     * @return
     */
    public static String multilayerMapToYaml(Map<String, Object> map) {
        Yaml yaml = createYaml();
        return yaml.dumpAsMap(map);
    }

    /**
     * 单层map转成yml
     *
     * @param map
     * @return
     */
    public static String flattenedMapToYaml(Map<String, Object> map) {
        Yaml yaml = createYaml();
        return yaml.dumpAsMap(flattenedMapToMultilayerMap(map));
    }

    /**
     * 单层map转换多层map
     *
     * @param map
     * @return
     */
    private static Map<String, Object> flattenedMapToMultilayerMap(Map<String, Object> map) {
        return getMultilayerMap(map);
    }

    private static Yaml createYaml() {
        return new Yaml();
    }

    @SuppressWarnings("unchecked")
    private static Map<String, Object> asMap(Object object) {
        Map<String, Object> result = new LinkedHashMap<>();
        if (!(object instanceof Map)) {
            result.put("document", object);
            return result;
        }
        Map<Object, Object> map = (Map<Object, Object>) object;
        for (Map.Entry<Object, Object> entry : map.entrySet()) {
            Object value = entry.getValue();
            if (value instanceof Map) {
                value = asMap(value);
            }
            Object key = entry.getKey();
            if (key instanceof CharSequence) {
                result.put(key.toString(), value);
            } else {
                result.put("[" + key.toString() + "]", value);
            }
        }
        return result;
    }

    private static Map<String, Object> getFlattenedMap(Map<String, Object> source) {
        Map<String, Object> result = new LinkedHashMap<>();
        buildFlattenedMap(result, source, null);
        return result;
    }

    private static void buildFlattenedMap(Map<String, Object> result, Map<String, Object> source, String path) {
        for (Map.Entry<String, Object> entry : source.entrySet()) {
            String key = entry.getKey();
            if (!StringUtils.isBlank(path)) {
                if (key.startsWith("[")) {
                    key = path + key;
                } else {
                    key = path + '.' + key;
                }
            }
            Object value = entry.getValue();
            if (value instanceof String) {
                result.put(key, value);
            } else if (value instanceof Map) {
                @SuppressWarnings("unchecked")
                Map<String, Object> map = (Map<String, Object>) value;
                buildFlattenedMap(result, map, key);
            } else if (value instanceof Collection) {
                @SuppressWarnings("unchecked")
                Collection<Object> collection = (Collection<Object>) value;
                int count = 0;
                for (Object object : collection) {
                    buildFlattenedMap(result, Collections.singletonMap("[" + (count++) + "]", object), key);
                }
            } else {
                result.put(key, (value != null ? value.toString() : ""));
            }
        }
    }

    private static Map<String, Object> getMultilayerMap(Map<String, Object> source) {
        Map<String, Object> rootResult = new LinkedHashMap<>();
        for (Map.Entry<String, Object> entry : source.entrySet()) {
            String key = entry.getKey();
            buildMultilayerMap(rootResult, key, entry.getValue());
        }
        return rootResult;
    }

    @SuppressWarnings("unchecked")
    private static void buildMultilayerMap(Map<String, Object> parent, String path, Object value) {
        String[] keys = StringUtils.split(path, ".");
        String key = keys[0];
        if (key.endsWith("]")) {
            String listKey = key.substring(0, key.indexOf("["));
            String listPath = path.substring(key.indexOf("["));
            List<Object> chlid = bulidChlidList(parent, listKey);
            buildMultilayerList(chlid, listPath, value);
        } else {
            if (keys.length == 1) {
                parent.put(key, stringToObj(value.toString()));
            } else {
                String newpath = path.substring(path.indexOf(".") + 1);
                Map<String, Object> chlid = bulidChlidMap(parent, key);
                buildMultilayerMap(chlid, newpath, value);
            }
        }
    }


    @SuppressWarnings("unchecked")
    private static void buildMultilayerList(List<Object> parent, String path, Object value) {
        String[] keys = StringUtils.split(path, ".");
        String key = keys[0];
        int index = Integer.parseInt(key.replace("[", "").replace("]", ""));
        if (keys.length == 1) {
            parent.add(index, stringToObj(value.toString()));
        } else {
            String newpath = path.substring(path.indexOf(".") + 1);
            Map<String, Object> chlid = bulidChlidMap(parent, index);
            buildMultilayerMap(chlid, newpath, value);
        }
    }


    @SuppressWarnings("unchecked")
    private static Map<String, Object> bulidChlidMap(Map<String, Object> parent, String key) {
        if (parent.containsKey(key)) {
            return (Map<String, Object>) parent.get(key);
        } else {
            Map<String, Object> chlid = new LinkedHashMap<>(16);
            parent.put(key, chlid);
            return chlid;
        }
    }

    @SuppressWarnings("unchecked")
    private static Map<String, Object> bulidChlidMap(List<Object> parent, int index) {
        Map<String, Object> chlid = null;
        try {
            Object obj = parent.get(index);
            if (null != obj) {
                chlid = (Map<String, Object>) obj;
            }
        } catch (Exception e) {
            log.warn("get list error");
        }
        if (null == chlid) {
            chlid = new LinkedHashMap<>(16);
            parent.add(index, chlid);
        }
        return chlid;
    }

    @SuppressWarnings("unchecked")
    private static List<Object> bulidChlidList(Map<String, Object> parent, String key) {
        if (parent.containsKey(key)) {
            return (List<Object>) parent.get(key);
        } else {
            List<Object> chlid = new GrowthList(16);
            parent.put(key, chlid);
            return chlid;
        }
    }

    private static Object stringToObj(String obj) {
        Object result;
        if (obj.equals("true") || obj.equals("false")) {
            result = Boolean.valueOf(obj);
        } else if (isBigDecimal(obj)) {
            if (obj.indexOf(".") == -1) {
                result = Long.valueOf(obj);
            } else {
                result = Double.valueOf(obj);
            }
        } else {
            result = obj;
        }
        return result;
    }

    public static boolean isBigDecimal(CharSequence self) {
        try {
            new BigDecimal(self.toString().trim());
            return true;
        } catch (NumberFormatException var2) {
            return false;
        }
    }

    public static void main(String[] args) {
        String content = "feign:\n" +
                "  hystrix:\n" +
                "    enabled: true\n" +
                "  client:\n" +
                "    config:\n" +
                "      default:\n" +
                "        connectTimeout: 10000\n" +
                "        readTimeout: 60000\n" +
                "management:\n" +
                "  health:\n" +
                "    db:\n" +
                "      enabled: false\n" +
                "  endpoints:\n" +
                "    web:\n" +
                "      base-path: /health";
        Map<String, Object> a = YamlParserUtil.yamlToFlattenedMap(content);
        System.out.println(a);

        Map<String, Object> b = YamlParserUtil.yamlToMultilayerMap(content);
        System.out.println(b);


        String c = YamlParserUtil.multilayerMapToYaml(b);
        System.out.println(c);
        String d = YamlParserUtil.flattenedMapToYaml(a);
        System.out.println(d);

    }
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java YAML工具类是一种用于处理YAML格式文件工具类,可以方便地读取、写入和操作YAML文件Java中有许多开源的第三方库可以用来处理YAML文件,比如SnakeYAML、Jackson、YAMLBeans等。这些库提供了完整的API和功能,可以帮助开发人员处理YAML文件的各种操作。 使用Java YAML工具类,我们可以通过简单的代码实现读取YAML文件的功能。通过调用相应的方法,我们可以将YAML文件的内容读取到一个Java对象中,然后进行相应的操作和处理。同时,我们也可以将Java对象以YAML格式写入到文件中,或者将Java对象转换YAML字符串进行传输或存储。 Java YAML工具类还提供了更高级的功能,比如支持对象的序列化和反序列化、自定义类型映射、错误处理等。我们可以通过配置相应的参数和监听器来实现这些功能。 总之,Java YAML工具类可以方便地处理YAML格式文件,在Java应用中起到了重要的作用。无论是读取配置文件、解析数据文件还是进行数据交换,Java YAML工具类都是一个很好的选择。 ### 回答2: Java开发中,YAMLYAML Ain't Markup Language)是一种轻量级的数据序列化格式,与JSON和XML类似,但更加直观和易读。为了在Java中处理YAML格式的数据,可以使用Java YAML工具类Java YAML工具类是一个用于读取和写入YAML文件工具类。它提供了简单易用的API,使得在Java程序中处理YAML数据变得非常方便。 对于读取YAML文件Java YAML工具类通常提供了以下几个步骤: 1. 创建一个YAML Parser对象,用于解析YAML文件。 2. 使用YAML Parser对象的API读取YAML文件的内容。通过提供文件路径或输入流,可以将YAML文件解析成Java对象。 3. 将解析后的Java对象用于后续的数据处理。 对于写入YAML文件Java YAML工具类可以使用以下步骤: 1. 创建一个YAML Writer对象,用于将数据写入YAML文件。 2. 使用YAML Writer对象的API将Java对象转换YAML格式的字符串。 3. 将YAML格式的字符串写入目标文件Java YAML工具类通常提供了丰富的API,可以处理各种类型的数据,包括基本数据类型、对象、集合等。它还支持注释、多文档以及一些高级特性,如引用和锚点。 Java YAML工具类的使用可以大大简化YAML数据的处理过程,提高开发效率。同时,它还能够保持YAML数据的格式和结构,使得程序的逻辑更加清晰易读。 综上所述,Java YAML工具类是一种用于读取和写入YAML文件工具类,通过简单易用的API,可以在Java程序中方便地处理YAML格式的数据。它能够保持YAML数据的格式和结构,提高开发效率和代码可读性。 ### 回答3: Java中的YAML工具类是一种用于读取和写入YAML文件的工具。YAMLYAML Ain't Markup Language)是一种人类可读的数据序列化格式,与JSON类似,但更易于阅读和编辑。 使用JavaYAML工具类,我们可以轻松地读取YAML文件并将其转换Java对象,或者将Java对象转换YAML格式。 在使用YAML工具类之前,我们需要引入相应的依赖库。常见的Java YAML库有SnakeYAML和Jackson YAML等。 例如,使用SnakeYAML库,可以使用以下代码读取YAML文件转换Java对象: ```java import org.yaml.snakeyaml.Yaml; import java.io.FileInputStream; public class Main { public static void main(String[] args) throws Exception { // 读取YAML文件 Yaml yaml = new Yaml(); FileInputStream inputStream = new FileInputStream("data.yaml"); Object data = yaml.load(inputStream); // 将YAML数据转换Java对象 MyClass myObject = (MyClass) data; // 使用Java对象 System.out.println(myObject.getName()); } } class MyClass { private String name; // getter和setter方法 } ``` 上述代码首先创建了一个Yaml对象,然后通过FileInputStream读取了名为"data.yaml"的YAML文件。load方法将YAML数据加载到一个Java对象中,然后我们可以使用这个Java对象。 此外,我们还可以将Java对象转换YAML格式并写入YAML文件。例如,使用上述的MyClass对象,可以使用以下代码将其转换YAML格式并写入文件: ```java import org.yaml.snakeyaml.Yaml; import java.io.FileWriter; public class Main { public static void main(String[] args) throws Exception { // 创建Java对象 MyClass myObject = new MyClass(); myObject.setName("John"); // 将Java对象转换YAML Yaml yaml = new Yaml(); String output = yaml.dump(myObject); // 将YAML写入文件 FileWriter writer = new FileWriter("output.yaml"); writer.write(output); writer.close(); } } class MyClass { private String name; // getter和setter方法 } ``` 上述代码将创建一个名为"John"的MyClass对象,并将其转换YAML格式。然后,通过FileWriter将YAML数据写入名为"output.yaml"的文件中。 总之,JavaYAML工具类使我们能够轻松地读取和写入YAML文件,以及将YAML数据转换Java对象和反之。这为处理YAML格式的数据提供了便利和灵活性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值