java - 自定义 SnakeYAML 转储样式

标签 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,则: "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/

相关文章:

java - 在 DynamoDB 中使用排序键时出现“索引键类型不匹配”

xml - yaml2xml/xml2yaml 实现可用吗?

ruby-on-rails - 在 YAML 字符串中嵌入 YAML 别名

azure - 配置请求延迟或发送失败

java - 以编程方式在 Android 中的 Php 服务器上上传图像

java - MD5 二进制字符串转换为字节数组

java - 是否可以使用 run-forked 从不同的 JVM 运行 Jetty?

java - 将 theta(angle) 转换到 float 量有什么作用?

java - 限制客户端仅使用从 yml 文件创建的配置列表中的一个配置

kubernetes - 集群上的事件与 kustomize 之间的区别