gpt4 book ai didi

java - 使用 Snake Yaml 的必填字段缺少双引号

转载 作者:行者123 更新时间:2023-12-05 02:56:29 37 4
gpt4 key购买 nike

我正在尝试读取 Yaml 模板并动态替换模板中的某些字段并创建一个新的 Yaml 文件。我生成的 yaml 文件应该在所有方面反射(reflect)模板,包括双引号。但是当我使用 snake yaml 时,我缺少必填字段的双引号。任何人都可以建议解决这个问题吗?

示例:

我的yaml模板如下图:

version: snapshot-01
kind: sample
metadata:
name: abc
groups:
id: "1000B"
category: category1

我正在阅读上面的模板并动态替换必填字段,如下所示。

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

现在我正在替换必填字段,如下所示

 yamlMap.put("version","v-1.0");
Map<String, Object> metadata = (Map<String, Object>) yamlMap.get("metadata");
metadata.put("name", "XYZ");

Map<String, Object> groups = (Map<String, Object>) yamlMap.get("groups");
groups.put("id","5000Z");
groups.put("category","newCategory");

DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
options.setPrettyFlow(true);

Yaml yaml = new Yaml(options);
String output = yaml.dump(map);
System.out.println(output);

我期待如下所示的输出

预期输出:

version: v-1.0
kind: sample
metadata:
name: XYZ
groups:
id: "5000Z"
category: newCategory

但实际上我得到的输出如下

version: v-1.0
kind: sample
metadata:
name: XYZ
groups:
id: 5000Z
category: newCategory

我的问题是,我在新 yaml 文件中缺少“id”节点的双引号。当我使用 options.setDefaultScalarStyle(ScalarStyle.DOUBLE_QUOTED) 时,我将所有字段都用双引号括起来,这不是必需的。我只需要 id 字段的双引号。谁能请教解决这个问题的建议。

谢谢

最佳答案

如果您的输入是模板,使用模板引擎可能会更好。作为简单示例,MessageFormat 允许您编写 id: "{0}" 然后将实际值插入其中,保留双引号。您可以根据您的用例使用更复杂的模板。


话虽这么说,让我们看看如何使用 SnakeYAML 来做到这一点:

如果你想控制单个项目如何呈现为标量,你必须像这样定义一个类:

class QuotedString {
public String value;

public QuotedString(String value) {
this.value = value;
}
}

然后为它创建一个自定义表示:

class MyRepresenter extends Representer {
public MyRepresenter() {
this.representers.put(QuotedString.class, new RepresentQuotedString());
}

private class RepresentQuotedString implements Represent {
public Node representData(Object data) {
QuotedString str = (QuotedString) data;
return representScalar(
Tag.STR, str.value, DumperOptions.ScalarStyle.DOUBLE_QUOTED);
}
}
}

修改代码以使用新类:

groups.put("id", new QuotedString("5000Z"));

最后,指示 SnakeYAML 使用您的代表:

Yaml yaml = new Yaml(new MyRepresenter(), options);

应该这样做。

关于java - 使用 Snake Yaml 的必填字段缺少双引号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60501519/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com