【问题标题】:Snake yaml : Issue with duplicate keys in Yaml templateSnake yaml:Yaml 模板中的重复键问题
【发布时间】:2023-03-05 18:39:01
【问题描述】:

我有一个需要动态更新的 Yaml 模板。

我正在使用蛇 yaml 读取 Yaml 模板并使用动态内容更新它并生成具有新值的新 yaml 文件

我正在按照以下步骤更新 yaml 文件。

  1. 假设下面是 Yaml 模板
--------------------------------
version: snapshot-01
kind: sample
metadata:
  name: abc
options: "<placeholder>"
--------------------------------

我正在使用蛇 yaml 将 yaml 转换为 Map,如下所示

 Yaml yaml = new Yaml();
 InputStream inputStream = 
 this.getClass().getClassLoader().getResourceAsStream(yamlTemplateLocation);
 Map<String, Object>yamlMap = yaml.load(inputStream); 

我正在动态替换必填字段,如下所示。

yamlMap.put("version","v-1.0");
yamlMap.put("options","newOptions");

最后,我使用以下代码将映射转换为字符串并作为 Yaml 文件存储:

DumperOptions options = new DumperOptions();
options.setSplitLines(false);
Yaml yaml = new Yaml(options);
System.out.println(yaml.dump(yamlMap));

生成的yaml文件是:

version: "v-1.0"
kind: sample
metadata:
  name: abc
options:  "newOptions"
--------------------------------

我现在遇到了一些问题

模板需要修改如下

--------------------------------
version: snapshot-01
kind: sample
metadata:
  name: abc
options: "<placeholder>"
---
version: v2
kind: sample
metadata:
 type: <abc> 
--------------------------------

我必须在模板中添加一些额外的部分,其中包括三个破折号以及相同的键,例如版本、种类和元数据

现在我需要用新值更新模板,如下所示

version: "v-1.0"
kind: sample
metadata:
  name: abc
options:  "newOptions"
---
version: v2-0
kind: sample
metadata:
 type: "newType"

我的问题是 --> 我正在将 yaml 转换为映射以进行更新。那么上例中yaml中存在重复键(如版本、版本)如何处理。

谁能帮我解决这个问题?提前致谢!

【问题讨论】:

  • 我需要更新两个部分

标签: java spring yaml snakeyaml


【解决方案1】:

在这种情况下,三个破折号标记 YAML 文档的结尾和新文档的开头,这意味着您在一个文件中拥有多个 YAML 文档。这种情况下,你需要使用loadAll来加载所有文档,然后dumpAll来写一个包含多个文档的文件:

List<Object> output = new ArrayList<Object>();
boolean first = true;
for (Map<String, Object> doc : yaml.loadAll(inputStream)) {
  if (first) {
    doc.put("version","v-1.0");
    doc.put("options","newOptions");
    first = false;
  }
  output.add(doc);
}
System.out.println(yaml.dumpAll(output));

您不会遇到重复键的问题,因为它们位于不同的文档中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    相关资源
    最近更新 更多