Snake yaml:Yaml 模板中的重复键问题
Snake yaml : Issue with duplicate keys in Yaml template
我有一个需要动态更新的 Yaml 模板。
我正在使用 snake yaml 读取 Yaml 模板并使用动态内容更新它并生成具有新值的新 yaml 文件
我正在按照以下步骤更新 yaml 文件。
- 假设下面是 Yaml 模板
--------------------------------
version: snapshot-01
kind: sample
metadata:
name: abc
options: "<placeholder>"
--------------------------------
我正在使用 snake 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中有重复的键(比如version,version),我该如何处理呢
有人可以帮我解决这个问题吗?提前致谢!
在这种情况下,三个破折号标记 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));
您不会遇到重复键的问题,因为它们在不同的文档中。
我有一个需要动态更新的 Yaml 模板。
我正在使用 snake yaml 读取 Yaml 模板并使用动态内容更新它并生成具有新值的新 yaml 文件
我正在按照以下步骤更新 yaml 文件。
- 假设下面是 Yaml 模板
--------------------------------
version: snapshot-01
kind: sample
metadata:
name: abc
options: "<placeholder>"
--------------------------------
我正在使用 snake 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中有重复的键(比如version,version),我该如何处理呢
有人可以帮我解决这个问题吗?提前致谢!
在这种情况下,三个破折号标记 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));
您不会遇到重复键的问题,因为它们在不同的文档中。