从我所看到的情况来看,对yaml命名约定的建议是遵循软件约定,因此以Java为例。
我已收到具有以下语法的yaml文件
PERSON:
NAME: John Doe
除非我从PERSON更改为person,否则我无法使snakeyaml正确映射到我的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进行加载。我尝试使用实例变量为PERSON的getPERSON / setPERSON进行尝试,但除非在yaml文件中更改为person,否则它将无法正常工作。
答案 0 :(得分:2)
您需要具有yaml文件中存在的字段名称,因为snakeyaml内部使用了Reflection 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;
}
}
请注意,字段必须按照here
进行公开然后,您需要传递带有参数作为根类的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);
}
}