snakeyaml命名约定

时间:2018-08-01 19:50:14

标签: java snakeyaml

从我所看到的情况来看,对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,否则它将无法正常工作。

1 个答案:

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