SnakeYaml - 如何使用`TypeDescription`配置集将yaml转换为pojos列表?

时间:2014-12-14 19:08:27

标签: groovy snakeyaml

我有一个像这样的简单YAML数据,我正在尝试使用SnakeYaml转换为名为Person的POJO对象。

age: 123
name: Jackson
phone:
  number: 123456

这是执行它的Groovy代码。

@ToString
class Person{
    def name
    def age
    Tel phone
}

@ToString
class Tel{
    def number
}

Constructor c = new Constructor(Person.class);
TypeDescription t = new TypeDescription(Person.class);
t.putListPropertyType("phone", Tel.class);
c.addTypeDescription(t);

def person = new Yaml(c).load(input)
println person

这会在Person内创建Tel对象,其中包含Person

但是,当我尝试按如下方式传递yaml中的- age: 123 name: Jackson phone: number: 123456 - age: 234 name: Jackson phone: number: 123456 列表时,我收到错误。

Caused by: org.yaml.snakeyaml.error.YAMLException: No suitable constructor with 2 arguments found     for class soapunit.Person
    at org.yaml.snakeyaml.constructor.Constructor$ConstructSequence.construct(Constructor.java:587)
    at org.yaml.snakeyaml.constructor.Constructor$ConstructYamlObject.construct(Constructor.java:340)
... 8 more

这是我得到的错误

{{1}}

2 个答案:

答案 0 :(得分:4)

我同意@cfrick,您的示例中的错误是您正在定义列表属性,因为您这样说:

t.putListPropertyType("phone", Tel.class);

但是在您的 Person 类中,您定义了一个单个电话:

class Person{
    def name
    def age
    Tel phone //<-- A SINGLE TELEPHONE!!!
}

要正确更正此问题,只需将 Person 类修改为:

class Person{
    def name
    def age
    List<Tel> phone //<-- A REAL LIST OF TELEPHONES!!!
}

答案 1 :(得分:0)

我找到了自己问题的答案。我在yaml内容中添加了显式分隔符以使其工作。

---
age: 123
name: Jackson
phone:
  number: 123456
---
age: 234
name: Jackson
phone:
  number: 123456