Пользовательский объект YAML

У меня есть простой документ YAML:

object:
  a: 1
  b: 2
  c: 3

Могу ли я прочитать эти свойства для пользовательского объекта, который содержит конструктор только с 1 аргументом. Например

public class CustomObject {
        private String value;

        public CustomObject(String value) {
            ....
        }

        getValue ...
        setValue ...
    }

где значение является результатом конкатенации свойств a,b,c с маской (результат 1:2/3)?


person Arseniy Ulakaiev    schedule 12.12.2016    source источник


Ответы (1)


Это возможно с помощью пользовательских конструкторов и представителей:

class CustomObjectConstructor extends Constructor {
    public CustomObjectConstructor() {
        this.yamlConstructors.put(new Tag("!customObject"), new ConstructCustomObject());
    }

    private class ConstructCustomObject extends AbstractConstruct {
        public Object construct(Node node) {
            final Map<Object, Object> values = constructMapping(node);
            final String a = (String) values.get("a");
            final String b = (String) values.get("b");
            final String c = (String) values.get("c");
            return new CustomObject(a + ":" + b + "/" + c);
        }
    }
}

Вы можете использовать его следующим образом:

Yaml yaml = new Yaml(new CustomObjectConstructor());
CustomObject myObject =
    (CustomObject) yaml.load("!customObject\na: 1\nb: 2\nc: 3");

Конечно, это требует уточнения для обработки случаев ошибок, но это показывает общую идею. Чтобы выгрузить объект как сопоставление, вы можете определить репрезентант аналогично приведенному здесь коду. Дополнительную информацию см. в документации.

person flyx    schedule 12.12.2016