从application.conf中检索对象列表

时间:2018-12-11 19:09:13

标签: scala playframework playframework-2.6

我在Play for Scala application.conf中有以下条目:

    jobs = [
       {number: 0, dir: "/dir1", name: "General" },
       {number: 1, dir: "/dir2", name: "Customers" }
    ] 

我想在Scala程序中检索以下对象列表:

    val conf = ConfigFactory.load
    val jobs = conf.getAnyRefList("jobs").asScala 
    println(jobs)

此打印

Buffer({number=0, name=General, dir=/dir1}, {number=1, name=Customers, dir=/dir2})

但是如何将结果转换为实际的Scala对象?

2 个答案:

答案 0 :(得分:3)

尝试这个:

case class Job(number: Int, dir: String, name: String)

object Job {
implicit val configLoader: ConfigLoader[List[Job]] = ConfigLoader(_.getConfigList).map(
    _.asScala.toList.map(config =>
      Job(
        config.getInt("number"),
        config.getString("dir"),
        config.getString("name")
      )
    )
  )
}

然后来自Confuctation DI Configuration.get[List[Job]]("jobs")

答案 1 :(得分:0)

这里是一个Config对象,它将从配置文件中提取数据到您指定的类型。

用法:

case class Job(number: Int, dir: String, name: String)

val jobs = Config[List[Job]]("jobs")

代码:

import com.typesafe.config._
import org.json4s._
import org.json4s.jackson.JsonMethods._

object Config {
  private val conf = ConfigFactory.load()
  private val jData = parse(conf.root.render(ConfigRenderOptions.concise))

  def apply[T](name: String)(implicit formats: Formats = DefaultFormats, mf: Manifest[T]): T =
    Extraction.extract(jData \\ name)(formats, mf)
}

如果特定的配置对象不存在或与T的格式不匹配,将抛出异常。