如何解决在 SnakeYaml 中转储对象时出现奇怪的字符
我正在使用 SnakeYaml 和 Java 尝试写入 yaml 文件,但在转储过程中我看到奇怪的字符...
这是我所拥有的:
PrintWriter writer = new PrintWriter(new File("./output.yaml"));
DumperOptions mapOptions = new DumperOptions();
mapOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.AUTO);
mapOptions.setDefaultScalarstyle(DumperOptions.Scalarstyle.LIteraL); // THIS LINE
mapOptions.setPrettyFlow(true);
Yaml mapYaml = new Yaml(mapOptions);
mapYaml.dump("mapping:",writer);
mapYaml.dump(" \"table\":" + "\"" + map.get(tableName) + "\"",writer);
我的期待:
mapping:
"table": "tableName"
我得到的输出:
|-
mapping:
|2-
"table": "tableName"
我也试过没有 DumperOptions.Scalarstyle.Literal
行(// 此行注释),但我得到了这个:
'mapping:'
' "table": "tableName"'
对于这两种方法,我该怎么做
(1) 清除 |-
和 |2-
符号以免被转储? (使用 Scalarstyle.LIteraL)
或
(2) 清除被打印的单引号? (没有 Scalarstyle.LIteraL)
我感谢任何人能给我的任何指导..
提前谢谢你!
解决方法
您正在使用 YAML 转储程序,就好像它是一个简单的输出流。你认为 YAML dumper 有什么作用?如果它只是写出你给它的字符串,那么使用它就没有意义了。
现在让我们看看实际发生了什么:
mapYaml.dump("mapping:",writer);
这里您要求 YAML 转储程序转储单个字符串 mapping:
。如果您提供 DumperOptions.ScalarStyle.LITERAL
,YAML 转储程序将完全按照您的要求执行并将其转储为文字块标量:
|-
mapping:
字符 |
开始一个文字块标量。以下所有缩进的行将按字面意思读取,无需任何处理。这将使此 YAML 加载为字符串 mapping:
,正如您所要求的那样。 -
后面的 |
告诉文字块标量不要在值中包含最后的换行符。
如果省略 DumperOptions.ScalarStyle.LITERAL
,YAML 转储程序需要适应 YAML 中的冒号是特殊字符这一事实。由于您明确要求转储程序将其作为字符串的一部分,因此转储程序需要引用该字符串:
'mapping:'
您刚刚看到的 YAML 文档已完成。每次调用 dump 都会发出一个完整的 YAML 文档,您不能只是将它们连接起来并期望它们合并为一个 YAML 文档。所以调用 dump 两次并不是你真正想要的。
现在让我们讨论第二行:
mapYaml.dump(" \"table\":" + "\"" + map.get(tableName) + "\"",writer);
输出中发生的情况与第一种情况大致相同。文字块标量中的 2
表示正好两个空格被读取为缩进。这会导致开头的额外两个空格被读取为内容,正如您所要求的那样。如果没有 DumperOptions.ScalarStyle.LITERAL
,转储程序再次需要引用字符串,因为它包含空格、双引号和冒号,所有这些都是特殊的 YAML 字符。
显然,这些都不是您想要做的。您需要了解 YAML 转储程序采用数据结构并将其序列化为 YAML。所以你需要做的是给它你想要的数据结构:
mapYaml.dump(Map.of("mapping",Map.of("table",map.get(tableName)));
同时将 DumperOptions.ScalarStyle.LITERAL
替换为 DumperOptions.FlowStyle.BLOCK
。这将为您提供所需的结构,尽管没有双引号。这无关紧要,因为生成的 YAML 是等效的。
要强制引用这些标量,请参阅 this answer。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。