首页 > 解决方案 > 解析 YAML 文件而不事先编写 java 类

问题描述

我想用 Java 编写一个 YAML 解析器,它能够解析不同格式的 YAML 文件。通常,人们会分析 YAML 并编写相应的 java 类,以便通过 Jackson 映射它们。但是,我想要一个可插拔的架构,并考虑一种允许为某些 YAML 模式生成适配器的方法。最佳解决方案是在读取 YAML 时直接生成所需的 java 类。

这有可能吗?

编辑:我重新考虑了我的问题并得出了解决方案,即读取 YAML 文件并将其写入 hashmap 是最合适的解决方法,无需为每种格式编写静态 java 类,我想接受。

Yaml yaml = new Yaml();
InputStream inputStream = this.getClass()
    .getClassLoader()
    .getResourceAsStream("templates/template.yml");
Map<String, Object> templateMap = yaml.load(inputStream);

标签: javaparsingyaml

解决方案


我想用 Java 编写一个 YAML 解析器,它能够解析不同格式的 YAML 文件。

该解析器与最流行的 Java YAML 解析器(Jackson 使用)SnakeYAML 有何不同?我并不是说不要这样做,但请注意您的问题可能已经解决了。

通常,人们会分析 YAML 并编写相应的 java 类,以便通过 Jackson 映射它们。

那么无论你想写什么都不是解析器。解析器是将原始输入数据转换为抽象语法树的组件。顺便说一下,Jackson 是 YAML 之上的抽象 API(它还提供 JSON 和 XML 支持)。如果要专门处理 YAML,通常最好直接使用 SnakeYAML。

但是,我想要一个可插拔的架构,并考虑一种允许为某些 YAML 模式生成适配器的方法。

看看 SnakeYAML 的 API。它允许您指定某个类作为加载 YAML 文件的目标。此类基本上用作输入的 YAML 模式。这意味着 SnakeYAML 是一个不知道目标模式的解析器,但为用户提供了指定模式的方法。这不正是你想要的吗?

最佳解决方案是在读取 YAML 时直接生成所需的 java 类。

您正在运行时阅读 YAML。类是在编译时用于定义数据布局和类型层次结构、促进类型检查、封装等的工具。通常,在运行时生成类是没有意义的。

总结一下:目前还不清楚你到底想做什么。也许试着用一个例子来描述你想解决的问题。您的问题的基本答案是:是的,当然可以在不知道目标类的情况下编写 YAML 解析器;SnakeYAML 就是证明。


推荐阅读