Мои 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
.