提问者:小点点

snakeyaml命名约定


从我所看到的看来,关于yaml命名约定的建议是遵循软件约定,所以在我的例子中Java。

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

PERSON:
  NAME: John Doe

除非我从PERSON更改为人,否则我无法让snakeyaml正确映射到我的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加载它。我已经尝试将我的实例变量作为PERSON使用getPERSON/setPERSON,但除非我在yaml文件中更改为人,否则它不起作用。


共1个答案

匿名用户

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

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

 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;
    }
}

注意字段需要按照这里的说明是公开的

然后您需要将带有参数的Constructor类对象作为您的根类传递。

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