1

我有一个像这样的简单 YAML 数据,我正在尝试将其转换为Person使用 SnakeYaml 调用的 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
4

2 回答 2

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!!!
}
于 2015-02-19T16:01:47.750 回答
0

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

---
age: 123
name: Jackson
phone:
  number: 123456
---
age: 234
name: Jackson
phone:
  number: 123456
于 2014-12-14T22:44:51.573 回答