【问题标题】:parse yaml with only value, NOT key-value pair,解析 yaml 只有值,而不是键值对,
【发布时间】:2018-07-21 09:57:32
【问题描述】:

我有一个如下所示的 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 与杰克逊解析器一起使用。

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

【问题讨论】:

  • 您的第二个文档尝试在人员对象列表中设置 Tom 对象和 Dick 对象。这就是为什么它不起作用。
  • 有什么办法可以避免将其解析为 TomDick 对象,而是将其设为名称为 Tom 或 Dick 的 Person 对象。例如。使用默认构造函数 Person(String name)? 调用
  • 他们更好的问题是这是否是在 YAML 中获得简洁性的正确方法。您应该考虑使用 YAML 标记以及如何在文档中适当地使用它们,而不是在程序中滥用对键的解释。

标签: jackson yaml


【解决方案1】:

您将需要一个自定义设置器来反序列化您的 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 的人员列表中。

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-13
    相关资源
    最近更新 更多