如何使用java解析yaml注释?

如何使用java解析yaml注释?,java,parsing,jackson,yaml,comments,Java,Parsing,Jackson,Yaml,Comments,我想在我的项目中使用yml配置文件。我正在使用jackson数据格式yaml解析yml文件。但我也需要解析yml注释。我在python中使用了类似的方法,使用了ruamel yaml。如何在java中实现同样的功能 Upd. 为什么?我想通过使用命令行参数来覆盖配置选项。所以,为了为每个选项生成描述消息,我想使用我的注释。像这样: 在myconfig.yml中 # Define a source directory src: '/foo/bar' # Define a destination

我想在我的项目中使用yml配置文件。我正在使用
jackson数据格式yaml
解析yml文件。但我也需要解析yml注释。我在python中使用了类似的方法,使用了
ruamel yaml
。如何在java中实现同样的功能

Upd.

为什么?我想通过使用命令行参数来覆盖配置选项。所以,为了为每个选项生成描述消息,我想使用我的注释。像这样:

在my
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

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

基本上,您有三层数据:

  • 您的配置架构。这定义了要在配置文件中定义的值
  • 配置文件本身,描述当前机器上的常规配置
  • 一次性开关,可覆盖常规配置
每个值的描述属于模式,而不是配置文件本身。想想看:如果有人在他们的机器上编辑配置文件并更改注释,您的帮助输出将突然显示不同的描述

我的建议是将描述添加到模式中。模式是加载YAML的Java类。我不知道为什么要使用Jackson,因为它使用SnakeYaml作为解析器,而且SnakeYaml完全能够反序列化到Java类中,但是有更多的配置选项,因为它不像Jackson那样泛化JSON和YAML

以下是如何使用SnakeYaml(注意,未经测试)的一般思路:


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

您不需要,因为YAML定义注释不能传递内容信息,因此,如果你以任何方式处理评论,你就违反了YAML规范。从更务实的角度看,Jackson在幕后使用的SnakeYaml不支持它。但这可能是一个XY问题,如果您描述您的用例,可能会有其他选择(例如使用YAML标记)。@flyx我刚刚添加了我的用例是的,您是对的。ruby之后我太放松了:)我写的代码几乎和你写的一样。非常感谢您的完整解释。
// 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());
    }
}