SnakeYaml - Как преобразовать yaml в список pojos с набором конфигурации TypeDescription?

У меня есть такие простые данные YAML, которые я пытаюсь преобразовать в объект POJO с именем Person, используя SnakeYaml.

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

person MFIhsan    schedule 14.12.2014    source источник


Ответы (2)


Я согласен с @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!!!
}
person El Marce    schedule 19.02.2015

Я нашел ответ на свой вопрос. Я добавил явный разделитель в содержимое yaml, чтобы он работал.

---
age: 123
name: Jackson
phone:
  number: 123456
---
age: 234
name: Jackson
phone:
  number: 123456
person MFIhsan    schedule 14.12.2014
comment
хорошо, это решает вашу проблему, но не отвечает на исходный вопрос. так проблема в списках? - person cfrick; 15.12.2014
comment
@cfrick: Действительно, смотрите мой ответ - person El Marce; 19.02.2015