使用 Snake Yaml 的必填字段缺少双引号
Missing double quotes for the required field using Snake Yaml
我正在尝试读取 Yaml 模板并动态替换模板中的某些字段并创建一个新的 Yaml 文件。我生成的 yaml 文件应该在所有方面反映模板,包括双引号。但是当我使用 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:
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);
}
}
}
修改您的代码以使用新的 class:
groups.put("id", new QuotedString("5000Z"));
最后,指示 SnakeYAML 使用您的代表:
Yaml yaml = new Yaml(new MyRepresenter(), options);
这应该可以做到。
我正在尝试读取 Yaml 模板并动态替换模板中的某些字段并创建一个新的 Yaml 文件。我生成的 yaml 文件应该在所有方面反映模板,包括双引号。但是当我使用 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:
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);
}
}
}
修改您的代码以使用新的 class:
groups.put("id", new QuotedString("5000Z"));
最后,指示 SnakeYAML 使用您的代表:
Yaml yaml = new Yaml(new MyRepresenter(), options);
这应该可以做到。