在类型安全配置中迭代字段

时间:2013-07-11 16:35:42

标签: scala typesafe

我有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返回所有条目的适当方法。我尝试了config.root(),但它似乎返回了所有属性,包括system,akka和许多其他属性。

5 个答案:

答案 0 :(得分:31)

entrySet折叠树。如果您只想迭代直接孩子,请使用:

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

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

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

答案 1 :(得分:20)

例如,您在Settings.scala

中有以下代码
val conf = ConfigFactory.load("perks.conf")

如果你在root配置上调用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,所以你需要导入scala.collection.JavaConversions._

答案 2 :(得分:0)

对任何可能需要它的人:

<?php
$headers = get_headers("http://www.example.com", 1);
echo $headers['Content-Encoding'];
?>

答案 3 :(得分:0)

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

我最终得到了:

conf.getConfig(baseKey).entrySet().foreach { entry =>
   println(s"${entry.getKey} = ${entry.getValue.unwrapped().toString}")
}

答案 4 :(得分:0)

val common = allConfig.getConfig("column.audit")
   val commonList = common.root().keySet()
      commonList.iterator().foreach( x => { 
      println("Value is :: " + x) 
    }
   )`

this should work. but if your keyset is will print indifferent order than app.conf.

eg: 

`> cat application.conf`

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

above scrip will print as 

Value is :: [load_id, load_ts, load_file_nm]