我想在不同情况下创建自定义转储样式,例如,我有该示例代码:
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
有解决方案吗?需要你的帮助。预先感谢。
答案 0 :(得分:1)
由于没有提供其他解决方案,因此我通过直接更改processScalar()
类中的Emitter
方法来解决了该问题。首先添加了检查,如果标量不是键而不是多行,则强制双引号(因为我想为多行使用普通样式)
if (!simpleKeyContext && !analysis.multiline) {
style = ScalarStyle.DOUBLE_QUOTED;
}
然后更改了开关大小写逻辑,在SINGLE_QUOTED
ScalarStyle
的情况下,我们将其写为double,因此,如果需要,密钥将以双引号引起来。
使用简单键值和不同样式,多行大小写和列表大小写运行JUnit测试。万事大吉。