从我所看到的看来,关于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文件中更改为人,否则它不起作用。
您需要在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);
}
}