如何使用java解析yaml注释?

时间:2018-05-04 17:48:27

标签: java parsing jackson yaml comments

我想在项目中使用yml配置文件。我正在使用jackson-dataformat-yaml来解析yml文件。但是我也需要解析yml注释。我使用ruamel yaml在python中使用了类似的方法。我怎么能在java中做同样的事情?

UPD。

为什么?好吧,我想通过使用命令行参数覆盖我的配置选项。因此,要为每个选项生成描述消息,我想使用我的评论。像这样:

在我的config.yml

# Define a source directory
src: '/foo/bar'

# Define a destination directory
dst: '/foo/baz'

因此,当您使用--help标志运行程序时,您将看到以下输出:

Your program can be ran with the following options: 
--src   Define a source directory
--dst   Define a destination directory

这种模型的主要好处是您不需要重复相同的语句两次,因为可以从配置文件中检索它们。

1 个答案:

答案 0 :(得分:1)

基本上,您有三层数据:

  • 您的配置架构。这定义了要在配置文件中定义的值。
  • 配置文件本身,描述当前计算机上的常规配置。
  • 一次性开关,覆盖通常的配置。

每个值确实属于模式的描述,而不是配置文件本身。想一想:如果有人在他们的机器上编辑配置文件并更改了注释,那么您的帮助输出会突然显示不同的描述。

我的建议是将描述添加到架构中。架构是您加载YAML的Java类。我不确定你为什么使用Jackson,因为它使用SnakeYaml作为解析器而SnakeYaml完全能够反序列化为Java类,但是它有更多的配置选项,因为它不会像杰克逊那样概括JSON YAML确实

以下是关于如何使用SnakeYaml(小心,未经测试)的一般想法:

// ConfigParam.java
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ConfigParam { String description(); }

// Configuration.java
public class Configuration {
    @ConfigParam("Define a source directory")
    String src;
    @ConfigParam("Define a destination directory")
    String dst;
}

// loading code
Yaml yaml = new Yaml(new Constructor(Configuration.class));
Configuration config = yaml.loadAs(input, Configuration.class);

// help generation code
System.out.println("Your program can be ran with the following options:")
for (Field field: Configuration.class.getFields()) {
    ConfigParam ann = field.getAnnotation(ConfigParam.class);
    if (ann != null) {
        System.out.println(String.format("--%s  %s", field.getName(), ann.description());
    }
}

为了将实际参数映射到配置,您还可以循环遍历类字段并将参数映射到加载配置后的字段名称​​(用标准值替换给定的值)。