snakeyaml 命名约定

snakeyaml naming convention

据我所知,yaml 命名约定的建议似乎是遵循软件约定,所以在我的例子中 Java。

我得到了一个具有以下语法的 yaml 文件

PERSON:
  NAME: John Doe

我无法让 snakeyaml 正确映射到我的 Person 对象,除非我从 PERSON 更改为 person。我也尝试过使用其他变量名称,但似乎只有驼峰式或小写的对象名称有效。当我从 PERSON 更改为 person 时,我可以毫无问题地读取所有大写属性 NAME 作为字符串。有人可以解释为什么会这样吗?

public class Configuration {

  private Person person;

  public Configuration() {
    person = new Person();
  }

  public Person getPerson() {
    return person;
  }

  public void setPerson(Person person) {
    this.person = person;
  }

}

当我在 yaml 文件中将 PERSON 大写时,无论 getter/setter 的语法如何,我都无法让 snakeyaml 加载它。我已经尝试 getPERSON/setPERSON 将我的实例变量作为 PERSON,但它不起作用,除非我在 yaml 文件中更改为 person。

您需要在 yaml 文件中使用字段名称,因为 snakeyaml 内部使用反射 Api

所以你的 class 看起来像这样-

 class Configuration {

    public Person PERSON;

    public Person getPERSON() {
        return PERSON;
    }

    public void setPERSON(Person PERSON) {
        this.PERSON = PERSON;
    }
}

class Person {

    public String NAME;

    public String getNAME() {
        return NAME;
    }

    public void setNAME(String NAME) {
        this.NAME = NAME;
    }
}

请注意,字段必须是 public,如所述 here

然后你需要传递Constructorclass对象作为你的根class.

Yaml yaml = new Yaml(new Constructor(Configuration.class));

完整代码..

class Test {

    public static void main(String[] args) throws FileNotFoundException {
        String filePath = "path/to/configuartion/file/configuration.yaml";
        InputStream input = new FileInputStream(new File(filePath));
        Yaml yaml = new Yaml(new Constructor(Configuration.class));
        Configuration configuration = yaml.load(input);
    }
}