19

我有 perks.conf:

autoshield {
    name="autoshield"
    price=2
    description="autoshield description"
}
immunity {
    name="immunity"
    price=2
    description="autoshield description"
}
premium {
    name="premium"
    price=2
    description="premium description"
}
starter {
    name="starter"
    price=2
    description="starter description"
}
jetpack {
    name="jetpack"
    price=2
    description="jetpack description"
}

我想迭代我的应用程序中的特权,如下所示:

val conf: Config = ConfigFactory.load("perks.conf")
val entries = conf.getEntries()
for (entry <- entries) yield {
  Perk(entry.getString("name"), entry.getInt("price"), entry.getString("description"))
}

但我找不到合适的方法来返回配置中的所有条目。我试过config.root()了,但它似乎返回了所有属性,包括 system、akka 和许多其他属性。

4

5 回答 5

40

entrySet倒塌树。如果您只想迭代直接子级,请使用:

conf.getObject("perks").asScala.foreach({ case (k, v) => ... })

k将是“autoshield”和“immunity”,但不是“autoshield.name”、“autoshield.price”等。

这需要您导入scala.collection.JavaConverters._.

于 2014-02-26T14:09:47.660 回答
22

例如,您的代码中有以下代码Settings.scala

val conf = ConfigFactory.load("perks.conf")

如果您调用entrySet根配置(不是conf.root(),而是此配置的根对象),它将返回许多垃圾,您需要做的是将所有特权放在 perks.conf 中的某个路径下:

perks {
  autoshield {
    name="autoshield"
    price=2
    description="autoshield description"
  }
  immunity {
    name="immunity"
    price=2
    description="autoshield description"
  }
}

然后在Settings.scala文件中获取此配置:

val conf = ConfigFactory.load("perks.conf").getConfig("perks")

然后在此配置上调用 entrySet ,您将获得所有条目,而不是来自根对象,而是来自特权。别忘了Typesafe Config是用java写的,entrySet返回java.util.Set,所以需要importscala.collection.JavaConversions._

于 2013-07-11T16:56:50.527 回答
1

getObject给了我一个合格的 json 对象(例如timeout.ms = 5变成{ timeout: { ms: 5 })。

我最终得到:

conf.getConfig(baseKey).entrySet().foreach { entry =>
   println(s"${entry.getKey} = ${entry.getValue.unwrapped().toString}")
}
于 2016-12-07T08:51:24.413 回答
1
val common = allConfig.getConfig("column.audit")
   val commonList = common.root().keySet()
      commonList.iterator().foreach( x => { 
      println("Value is :: " + x) 
    }
   )

这应该有效。但是,如果您的密钥集将以不同于 app.conf 的顺序打印。

例如:

> cat application.conf

`column {
  audit {
    load_ts = "current_timestamp",
    load_file_nm = "current_filename",
    load_id = "load_id"
  }`

上面的脚本将打印这个:

Value is :: [load_id, load_ts, load_file_nm]
于 2019-02-05T14:59:59.873 回答
0

对于任何可能需要它的人:

val sysProperties = System.getProperties
val allConfig = ConfigFactory.load("perks.conf")
val appConfig = allConfig.entrySet().filter { entry =>
  !sysProperties.containsKey(entry.getKey)
}
于 2016-02-02T01:57:29.897 回答