在 Jackson 中的单个文件中反序列化来自多个 YAML 文档的 POJO

2022-09-04 08:00:53

我有一个YAML文件,看起来像这样:

---
name: Sam
tags:
    -   Dev
    -   Java
----
name: Bob
tags:
    -   PM

我想使用 Jackson 来反序列化文件中的所有文档,但我没有看到使用正常文档来执行此操作的方法。如果我使用 YAMLFactory 为我的文件创建解析器,我可以单步执行所有令牌,因此解析器显然能够处理多个文档 - 但是我如何将它们绑定在一起?看起来由我的YAMLFactory创建的解析器只解析文件中的单个文档。ObjectMapper

我也尝试过直接创建一个 YAMLParser 并使用 ,但是 ObjectMapper 耗尽了整个 YAMLParser 来反序列化单个实例。ObjectMapper#readValue(JsonParser, Class)


答案 1

这是几年后的事情,但值得指出的是,这是受支持的。Jackson 的语义略有不同,可能是因为它是 JSON 起源。这可以通过使用 中的映射编辑器来实现。ObjectMapper

YAMLFactory yaml;
ObjectMapper mapper;

YAMLParser yamlParser = yaml.createParser("file-with-multiple-docs.yaml")
List<ObjectNode> docs = mapper
      .readValues<ObjectNode>(yamlParser, new TypeReference<ObjectNode> {})
      .readAll();

如果需要,请更换为您自己的POJO。ObjectNode


答案 2

你可以直接使用SnakeYaml(Jackson YAML解析器在内部使用它):

try (InputStream input = new FileInputStream(file)) {
    Yaml yaml = new Yaml(new SafeConstructor());
    yaml.loadAll(input).forEach( System.out::println );
} catch (Throwable e) {
    System.out.println("ERROR: " + e.getMessage());
}

将产生:

{name=Sam, tags=[Dev, Java]}
{name=Bob, tags=[PM]}

推荐