首页 > 解决方案 > 解析 yaml 只有值,而不是键值对,

问题描述

我有一个如下所示的 yaml 文档 -

--- 
Village: 
  Persons: 
    -
      name: Tom
      age: 65
      children: 
        - Bob
        - Marla
    - 
      name: Dick
      age: 58

它可以很容易地解析。现在为简洁起见,我想像这样制作相同的文件 -

--- 
Village: 
  Persons: 
    - 
      Tom: 
        age: 65
        children: 
          - Bob
          - Marla
    - 
      Dick: 
        age: 58

请注意,本质上它是相同的数据。如何将其解析为Person上述文档之类的对象?我正在将 Java 与杰克逊解析器一起使用。

显然,我有所有 getter 和 setter 的VillagePerson类。我认为带有默认构造函数和 String 参数的 Person 类可以解决问题,但事实并非如此。

标签: jacksonyaml

解决方案


您将需要一个自定义设置器来反序列化您的Village类中的 Persons。然后,您的Village课程将如下所示:

public class Village {
    List<Person> persons = new ArrayList<>();

    @JsonProperty("Persons")
    public void setPersons(Map<String, Person> personMap){
        for (Map.Entry<String, Person> entry : personMap.entrySet()) {
            entry.getValue().setName(entry.getKey());
            persons.add(entry.getValue());
    }

    public List<Person> getPersons() {
        return persons;
    }

}

setPersons方法内部,来自您的 yaml 的 Persons 被用作键值对。
由于 yaml 中的键是 Person 的名称,因此您只需迭代映射并使用setName将名称注入每个Person对象。
之后,您将 Person 添加到您的Village.


推荐阅读