自定义SnakeYAML转储样式

时间:2018-07-22 23:52:02

标签: java yaml

我想在不同情况下创建自定义转储样式,例如,我有该示例代码:

DumperOptions options = new DumperOptions();
options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
options.setDefaultScalarStyle(DumperOptions.ScalarStyle.PLAIN);
Yaml yaml = new Yaml(options);
Map<Object, Object> map = new LinkedHashMap<>();
map.put("list", new ArrayList<>(Arrays.asList("entry1", "entry2")));
map.put("multiline", "line 1\nline 2\nline 3");
map.put("oneline", "line");
map.put("oneline-special", "line with #");
map.put("oneline-special #", "line with #");
yaml.dump(map, fileWriter);

转储结果为:

list:
- entry1
- entry2
multiline: |-
  line 1
  line 2
  line 3
oneline: line
oneline-special: 'line with #'
'oneline-special #': 'line with #'

问题:
无论如何,我想在双引号中使用双引号,如果它是字符串key: "value",并且只需要键,则使用"key": "value"。另外,我需要保存DumperOptions.ScalarStyle.PLAIN以支持漂亮的样式多行字符串输出。
我试图找到与此相关的任何内容,却发现很少有关Representer扩展的信息,但是似乎它不能解决我的问题,即使用显式样式(对键不加引号,但对值加倍),我考虑扩展{{1} },但它是最后一堂课,因此如果不重写部分库,就无法使用它。

所以,我的最终结果应该是:

Emitter

有解决方案吗?需要你的帮助。预先感谢。

1 个答案:

答案 0 :(得分:1)

由于没有提供其他解决方案,因此我通过直接更改processScalar()类中的Emitter方法来解决了该问题。首先添加了检查,如果标量不是键而不是多行,则强制双引号(因为我想为多行使用普通样式)

if (!simpleKeyContext && !analysis.multiline) {
    style = ScalarStyle.DOUBLE_QUOTED;
}

然后更改了开关大小写逻辑,在SINGLE_QUOTED ScalarStyle的情况下,我们将其写为double,因此,如果需要,密钥将以双引号引起来。

使用简单键值和不同样式,多行大小写和列表大小写运行JUnit测试。万事大吉。