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 中获取键列表。然后您可以使用这些键来使用任何现有的方法,例如 getString
、getConfig
等
因为每个Config都有一个根(整个object的根),所以有很多混淆,但是你的hierarcy的顶部也叫根,我们说的是两个不同的根。这是 scala shell 的摘录,它说明了正在发生的事情:
cfig
的类型是 Config
cfig.root()
是 ConfigObject 类型,您可以在其中迭代 children,并且您可以在其中调用 entrySet
和 keySet
。在你的情况下,cfig.root()
中唯一的 child 是 root
,这是你的层次结构的顶部
cfig.getObject("root")
是 ConfigObject 类型,但它的 children 是 children 比你的层次结构顶层低一级 - value1
, value2
、values
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)
假设我有这样的配置:
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 中获取键列表。然后您可以使用这些键来使用任何现有的方法,例如 getString
、getConfig
等
因为每个Config都有一个根(整个object的根),所以有很多混淆,但是你的hierarcy的顶部也叫根,我们说的是两个不同的根。这是 scala shell 的摘录,它说明了正在发生的事情:
cfig
的类型是Config
cfig.root()
是 ConfigObject 类型,您可以在其中迭代 children,并且您可以在其中调用entrySet
和keySet
。在你的情况下,cfig.root()
中唯一的 child 是root
,这是你的层次结构的顶部cfig.getObject("root")
是 ConfigObject 类型,但它的 children 是 children 比你的层次结构顶层低一级 -value1
,value2
、values
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)