hocon中的动态键

时间:2015-12-08 21:57:27

标签: java scala hocon

我们说我的配置如下:

root {
  value1: 1
  value2: 2

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

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

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

2 个答案:

答案 0 :(得分:2)

试试这个:

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

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

答案 1 :(得分:1)

由于每个Config都有一个根(整个对象的根),因此存在很多混淆,但是你的层次结构的顶部也称为root,我们讨论的是两个不同的根。这是scala shell的摘录,它说明了发生了什么:

  • cfig的类型为Config
  • cfig.root()的类型为ConfigObject,您可以在其中迭代子项,您可以在其中调用entrySetkeySet。在您的情况下,cfig.root()唯一的孩子是root,这是您的层次结构的顶部
  • cfig.getObject("root")属于ConfigObject类型,但其子级是层次结构顶部以下一级的子级 - value1value2values

    scala> cfig
    

res75:com.typesafe.config.Config = Config(SimpleConfigObject({" root":{" value1":1," value2":2, "值" {" 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)