当从 map 转换为 yaml 时,Snake yaml 转储程序选项为带空格的字符串生成不必要的转义空格字符(“\”)

Snake yaml dumper options generating unnecessary escape spaces character ("\ ") for a String with spaces when converting from map to yaml

我正在尝试读取 Yaml 模板并动态替换模板中的某些字段,并使用 Snake Yaml 创建一个新的 Yaml 文件。但是,当我使用 snake yaml 时,如果字符串包含必填字段的 spacess,我将获得转义 space 字符。谁能建议解决这个问题?

我在使用 spaces 从地图到 yaml 的转换中遇到了另一个问题。

示例:

--------------------------------
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);

当我用包含 spaces 的字符串替换占位符时,例如:"abc sfksajfkl jfajfkjakj jqjlkkalkl kajklfjalkd"

yamlMap.put("version","v-1.0");
yamlMap.put("options","abc sfksajfkl jfajfkjakj jqjlkkalkl kajklfjalkd");

我得到的输出为

--------------------------------
version: "v-1.0"
kind: sample
metadata:
  name: abc
options:  "abc  sfksajfkl  jfajfkjakj  
      \ jqjlkkalkl  kajklfjalkd "
--------------------------------

注意:它正在生成转义 space 字符(即“\”) 在 "abc sfksajfkl jfajfkjakj \ jqjlkkalkl kajklfjalkd "

但我的要求如下 - 不应生成任何转义 space 字符

--------------------------------
version: "v-1.0"
kind: sample
metadata:
  name: abc
options:  "abc  sfksajfkl  jfajfkjakj  jqjlkkalkl  kajklfjalkd"
--------------------------------

有人可以帮我解决这个问题吗?提前致谢!

您显示的代码与 YAML 输出不匹配,因为该代码只有一个 space。我假设 YAML 中的内容是放入地图中的实际字符串,因为您显示的代码不会生成此 YAML,并且您的要求还包括双 spaces.

转义字符只是换行的副作用。当在多行上断开带引号的标量时,换行符被折叠成 single spaces。但是,单词之间有多个 space,因此 YAML 必须插入一个转义的 space 以将第二个 space 标记为内容(所有非转义的 space 在第二行的开头被认为是缩进而不是内容的一部分)。

所以你实际需要解决的问题是换行。您可以这样禁用它:

DumperOptions options = new DumperOptions();
options.setSplitLines(false);
Yaml yaml = new Yaml(options);
System.out.println(yaml.dump(yamlMap));

附带说明一下,带有换行符和转义 space 的 YAML 确实可以正确加载。尽量不要对 YAML 表示提出太具体的要求,因为您无法完全控制它。