Динамические клавиши в 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, так далее.

Другие вопросы по тегам