您可以使用 SnakeYAML 库来解析和比较这两个 YAML 字符串,并使用 Java 8 的流操作来实现变量的新增和覆盖。以下是一个示例代码:\n\njava\nimport org.yaml.snakeyaml.DumperOptions;\nimport org.yaml.snakeyaml.Yaml;\n\nimport java.util.LinkedHashMap;\nimport java.util.Map;\n\npublic class YamlComparator {\n public static void main(String[] args) {\n String yaml1 = "deploy:\n" +\n " url: 123456@.qq.com\n" +\n " name: 123456\n" +\n "swagger:\n" +\n " enabled: ${swaggerEnabled:false}";\n \n String yaml2 = "server:\n" +\n " port: 50012\n" +\n " tomcat:\n" +\n " uri-encoding: UTF-8\n" +\n " servlet:\n" +\n " context-path: /api/ts-dc\n" +\n "spring:\n" +\n " profiles:\n" +\n " active:\n" +\n " - ${profileName:prod}\n" +\n " servlet:\n" +\n " multipart:\n" +\n " max-file-size: 100MB\n" +\n " max-request-size: 100MB\n" +\n " ######################################mysql基础数据库-需要修改链接 start################################################\n" +\n "swagger:\n" +\n " # 是否开启swagger\n" +\n " enabled: ${swaggerEnabled:false}";\n\n Map<String, Object> yaml1Map = new Yaml().load(yaml1);\n Map<String, Object> yaml2Map = new Yaml().load(yaml2);\n\n // 对比并合并两个YAML配置\n Map<String, Object> mergedYamlMap = mergeYamlMaps(yaml1Map, yaml2Map);\n\n // 将合并后的YAML配置转换为字符串\n String yaml3 = new Yaml(dumperOptions()).dump(mergedYamlMap);\n\n System.out.println(yaml3);\n }\n\n private static DumperOptions dumperOptions() {\n DumperOptions options = new DumperOptions();\n options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);\n options.setPrettyFlow(true);\n return options;\n }\n\n private static Map<String, Object> mergeYamlMaps(Map<String, Object> yaml1Map, Map<String, Object> yaml2Map) {\n Map<String, Object> mergedMap = new LinkedHashMap<>(yaml2Map);\n\n // 遍历第一个YAML配置的键值对\n for (Map.Entry<String, Object> entry : yaml1Map.entrySet()) {\n String key = entry.getKey();\n Object value = entry.getValue();\n\n // 如果第二个YAML配置不包含当前键,则新增键值对\n if (!mergedMap.containsKey(key)) {\n mergedMap.put(key, value);\n } else {\n // 如果第二个YAML配置包含当前键,则覆盖对应的值\n Object existingValue = mergedMap.get(key);\n\n // 如果值是嵌套的Map,则递归合并\n if (value instanceof Map && existingValue instanceof Map) {\n Map<String, Object> mergedNestedMap = mergeYamlMaps((Map<String, Object>) value, (Map<String, Object>) existingValue);\n mergedMap.put(key, mergedNestedMap);\n } else {\n mergedMap.put(key, value);\n }\n }\n }\n\n return mergedMap;\n }\n}\n\n\n此代码通过SnakeYAML库解析并加载了两个YAML字符串为Map。然后使用递归算法比较并合并两个YAML配置的键值对,并将结果转换回YAML字符串。输出的yaml3就是合并后的YAML格式的字符串3。\n\n请注意,该代码假设两个YAML字符串的格式是正确的,并且不会发生解析错误。

YAML 字符串合并:将 YAML 字符串 1 中的变量合并到 YAML 字符串 2 中

原文地址: https://www.cveoy.top/t/topic/qeKf 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录