hocon 中的动态键

Dynamic keys in hocon

假设我有这样的配置:

root {
  value1: 1
  value2: 2

  values {
     dynamic1 {
        static1: 10
        static2: "test"
     }
     dynamic2 {
        static1: 10
        static2: "test"
     }
  }
}

root.values 元素的子元素具有动态名称时,是否有可能以及如何获取它们的集合(也许是地图?)?

我找到了方法 Config.getConfigList,但它没有提供 'subconfigs' 的名称。

试试这个:

// Map[String,String]
val values = node.root().keySet.asScala map (id => 
  id -> node.getString(id)
) toMap

说明:您无法查询值映射(不知道为什么),但您可以通过调用 node.root().keySet.asScala 从 ConfigObject 中获取键列表。然后您可以使用这些键来使用任何现有的方法,例如 getStringgetConfig

因为每个Config都有一个根(整个object的根),所以有很多混淆,但是你的hierarcy的顶部也叫根,我们说的是两个不同的根。这是 scala shell 的摘录,它说明了正在发生的事情:

  • cfig 的类型是 Config
  • cfig.root() 是 ConfigObject 类型,您可以在其中迭代 children,并且您可以在其中调用 entrySetkeySet。在你的情况下,cfig.root() 中唯一的 child 是 root,这是你的层次结构的顶部
  • cfig.getObject("root") 是 ConfigObject 类型,但它的 children 是 children 比你的层次结构顶层低一级 - value1value2values

    scala> cfig
    

res75: com.typesafe.config.Config = Config(SimpleConfigObject({"root":{"value1":1,"value2":2,"values":{"dynamic1":{"static1":10,"static2":"test"},"dynamic2":{"static1":10,"static2":"test"}}}}))

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)