当从 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 表示提出太具体的要求,因为您无法完全控制它。
我正在尝试读取 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 表示提出太具体的要求,因为您无法完全控制它。