微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 SnakeYaml 中转储对象时出现奇怪的字符

如何解决在 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 举报,一经查实,本站将立刻删除。