微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Snake Yaml:Yaml模板中的重复键出现问题

如何解决Snake Yaml:Yaml模板中的重复键出现问题

我有一个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");

最后我将使用以下代码将map转换为String并以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中有重复的键(例如版本,版本),我该如何处理。

有人可以帮我吗?预先感谢!

解决方法

在这种情况下,三个破折号标记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));

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。