我想在不同的情况下制作自定义转储样式,例如我有示例代码:
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,则: "key": "value"
>。另外,我需要保存 DumperOptions.ScalarStyle.PLAIN
以支持漂亮样式的多行字符串输出。
我试图找到与此相关的任何内容,发现了一些关于 Representer
扩展的信息,但似乎它无法用显式样式解决我的问题(键上没有引号,但值上加倍),我考虑过扩展 Emitter
,但它是最终类,因此如果不重写部分库就无法使用它。
所以,我的最终结果应该是:
list:
- "entry1"
- "entry2"
multiline: |-
line 1
line 2
line 3
oneline: "line"
oneline-special: "line with #"
"oneline-special #": "line with #"
number: 512
有什么解决办法吗?需要你的帮助。提前致谢。
最佳答案
由于没有提供其他解决方案,我通过直接更改 Emitter
类中的 processScalar()
方法解决了这个问题。首先添加检查以强制双引号,如果标量不是键也不是多行(因为我想要多行的简单样式):
if (!simpleKeyContext && !analysis.multiline) {
style = ScalarStyle.DOUBLE_QUOTED;
}
然后更改了 switch case 逻辑,在 SINGLE_QUOTED
ScalarStyle
的情况下,我们编写为 double ,因此,如果需要,键将以双引号样式编写。< br/>
使用简单的键值和不同的样式、多行大小写和列表大小写运行 JUnit 测试。一切都很好,闪闪发光。
关于java - 自定义 SnakeYAML 转储样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51470143/