Динамические клавиши в hocon
Допустим, у меня есть конфиг как это:
root {
value1: 1
value2: 2
values {
dynamic1 {
static1: 10
static2: "test"
}
dynamic2 {
static1: 10
static2: "test"
}
}
}
Возможно ли и как получить коллекцию (возможно, карту) подэлементов root.values
элемент, когда они имеют динамическое имя?
Я нашел метод Config.getConfigList, но он не предоставляет имя 'subconfigs'.
2 ответа
Существует много путаницы, потому что каждый Config имеет корень (корень всего объекта), но вершина вашей иерархии также называется root, и мы говорим о двух разных корнях. Вот выдержка из оболочки scala, которая иллюстрирует происходящее:
cfig
имеет типConfig
cfig.root()
имеет тип ConfigObject, где вы можете перебирать дочерние элементы, и где вы можете вызватьentrySet
а такжеkeySet
, В вашем случае единственный ребенокcfig.root()
являетсяroot
, который является вершиной вашей иерархииcfig.getObject("root")
имеет тип ConfigObject, но его дочерние элементы являются дочерними на один уровень ниже вершины вашей иерархии -value1
,value2
,values
scala> cfig
res75: com.typesafe.config.Config = Config (SimpleConfigObject ({"root": {"value1": 1, "value2": 2, "values": {"dynamic1": {"static1": 10, "static2" ":" тест "}," Dynamic2":{"static1":10,"static2":" тест "}}}}))
scala> cfig.root()
res74: com.typesafe.config.ConfigObject = SimpleConfigObject({"root":{"value1":1,"value2":2,"values":{"dynamic1":{"static1":10,"static2":"test"},"dynamic2":{"static1":10,"static2":"test"}}}})
scala> val c2 = cfig.getObject("root")
c2: com.typesafe.config.ConfigObject = SimpleConfigObject({"value1":1,"value2":2,"values":{"dynamic1":{"static1":10,"static2":"test"},"dynamic2":{"static1":10,"static2":"test"}}})
scala> c2.entrySet.size
res72: Int = 3
scala> c2.keySet.toSet
res73: scala.collection.immutable.Set[String] = Set(value2, value1, values)
Попробуй это:
// Map[String,String]
val values = node.root().keySet.asScala map (id =>
id -> node.getString(id)
) toMap
Объяснение: Вы не можете запросить карту значений (не знаю почему), но вы можете получить список ключей из ConfigObject, вызвав node.root().keySet.asScala
, Затем вы можете использовать эти ключи, чтобы использовать любой из существующих методов, таких как getString
, getConfig
, так далее.