Как разобрать YAML на карту с помощью snakeyaml - PullRequest
0 голосов
/ 12 октября 2018

Мои YAML-файлы выглядят примерно так.

values:
  key1:
    subkey1:
      type: abc
      value: someValue
    subkey3:
      type: xyz
      value: someOtherValue

  key2:
    subkey2:
      type: def
      value: yetAnotherValue

Я могу разобрать их в структуру карты (Map<String,Key>) с помощью snakeyaml.Ключи карты в приведенном выше примере: key1 и key2.

Вот мой код для достижения этой цели:

public Map<String, Keys> parse(InputStream inputStream) {
  Yaml yaml = new Yaml(new Constructor(Values.class));
  ((Values) yaml.load(inputStream)).getValues();

private static class Values {
  public Map<String, Keys> keys;

  public Map<String, Keys> getKeys() {
    return keys;
  }
}

В моем классе Keys у меня есть:

public class Keys {

  private SomeClass subkey1;
  private SomeClass subkey2;
  private SomeClass subkey3;

  // getters and setter
  ...
}

Это, конечно, некрасиво и не очень обобщенно.Чего я хочу, так это иметь карту:

public class Keys {

  private Map<String, SomeClass> subKeys;

Поэтому вместо того, чтобы звонить:

map.get("key1").getSubkey2().getValue();

Я бы тогда позвонил

map.get("key1").get("subkey2").getValue();

Я неконечно, что мне не хватает, но я не могу понять, как заставить snakeyaml отобразить такую ​​структуру.

EDIT : я удалил верхний уровень values и изменил свойкод для сопоставления со структурой по умолчанию Map<String, Map<String, Map<String, String>>>.Это работает нормально, но работать с этими объектами немного громоздко.

Так что, возможно, мой вопрос можно перефразировать: как должны выглядеть мои классы Java и конфигурация snakeyaml для отображения в такую ​​структуру:

Верхний уровень: Map<String, Keys>

Затем класс Keys содержит еще одну карту: Map<String, Element>

И наконец Element имеет два поля: type и value.

...