使用SnakeYaml转储带引号的值

时间:2019-03-20 19:34:55

标签: java yaml snakeyaml

具有以下简单的yml文件test.yml

color: 'red'

我按如下方式加载和转储文件

        final DumperOptions yamlOptions = new DumperOptions();
        yamlOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);

        Yaml yaml = new Yaml(yamlOptions);


        Object result = yaml.load(new FileInputStream(new File("test.yml")));

        System.out.println(yaml.dump(result));

我希望得到

color: 'red'

但是,在转储过程中,序列化程序会忽略引号和打印内容

color: red

如何使序列化程序也打印原始报价?

1 个答案:

答案 0 :(得分:0)

  

如何使序列化程序也打印原始报价?

不适用于高级API。引用the spec

  

标量样式是表示形式的详细信息,除用于标记解析的目的是区分普通标量外,不得用于传达内容信息。

高级API实现了整个YAML加载过程,仅提供YAML文件的内容,而没有规范要求的有关演示细节的任何信息。

话虽如此,您可以使用保留演示文稿详细信息的低级API:

final Yaml yaml = new Yaml();
final Iterator<Event> events = yaml.parse(new StreamReader(new UnicodeReader(
        new FileInputStream(new File("test.yml"))).iterator();

final DumperOptions yamlOptions = new DumperOptions();
final Emitter emitter = new Emitter(new PrintWriter(System.out), yamlOptions);
while (events.hasNext()) emitter.emit(events.next());

但是,请注意,即使这样也不会保留您输入的每个演示文稿详细信息(例如,缩进和注释将不会保留)。 SnakeYaml不是双向传递的,因此无法保留确切的输入布局。