gpt4 book ai didi

java - 如何使用java解析yaml注释?

转载 作者:行者123 更新时间:2023-11-30 06:11:17 24 4
gpt4 key购买 nike

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

更新。

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

在我的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 执行此操作的一般想法(注意,未经测试):

// 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());
}
}

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

关于java - 如何使用java解析yaml注释?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50180529/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com