当前位置: 首页 > 知识库问答 >
问题:

Snake yaml:在yaml模板中使用重复密钥发出

司寇阳朔
2023-03-14

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

    null
--------------------------------
version: snapshot-01
kind: sample
metadata:
  name: abc
options: "<placeholder>"
--------------------------------
 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转换为字符串和strore作为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"

共有1个答案

吴俊风
2023-03-14

在本例中,三个破折号标记YAML文档的结束和新文档的开始,这意味着在一个文件中有多个YAML文档。在这种情况下,您需要使用LoadAll加载所有文档,然后使用DumpAll编写包含多个文档的文件:

java prettyprint-override">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解析器错误时,这是正确的yaml语法吗。

  • 我想自动部署可变数量的虚拟机(通过副本部署),通过取代密码的密钥保险库秘密。我想为不同的VM使用不同的秘密(例如secret1用于VM1,secret2用于VM2)。根据文档,我需要引用一个带有动态id的秘密https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource-manager-keyvault-paramete

  • 假设我想要一个复合键作为采购订单实体的street,city。 下面是我如何识别做这件事, 我想明白@AttributeOverrides注释到底是做什么的?即使我将colomn name更改为something STREET1,我仍然看到使用列名street创建的表。那么column=@column(name=“street”))在这里做什么。 另外,我可以将它作为PurchaseOrder类的

  • 是否有任何方法可以使用java编辑/删除YAMLfile中的值。 我正在使用struts2-jquery-grid,其中数据将从YAML文件中填充。现在,如果我编辑字段,它应该保存在YAML文件中。我能够分别使用yaml.load()和yaml.dump()从YAML格式的文件中读取值并将值写入文件。但是,我没有任何想法来编辑和删除特定的字段。 我经历过http://code.google.com

  • 在 Dreamweaver 中创建重复区域和重复表格并配置表格属性以控制您的页面布局。 重复区域是模板的一部分,这一部分可以在基于模板的页面中重制多次。重复区域通常与表格一起使用,但您也可以为其他页面元素定义重复区域。 使用重复区域,您可以通过重复特定项目来控制页面布局,例如目录项、说明布局或者重复数据行(如项目列表)。 有两个重复区域模板对象可供使用:重复区域和重复表格。 在模板中创建重复区域

  • 考虑以下代码: 我唯一发现的是: dump(Object data)方法接受Java对象并生成YAML文档 和 是只有我一个人,还是文档感觉非常神秘和指定?其中一半是关于我甚至从未听说过的特殊应用。我只看着它就觉得自己很傻,这让我有点生气。 不管怎样;如果你能给我任何帮助,我将不胜感激。