16

我创建了一个 Play 应用程序(2.1),它使用Hocon 格式conf/application.conf的配置。

我想在配置中添加一组项目。该文件conf/application.conf如下所示:

...
projects = [
  {name: "SO", url: "http://stackoverflow.com/"},
  {name: "google", url: "http://google.com"}
]

我尝试在我的 Scala 项目中阅读此配置:

import scala.collection.JavaConversions._
case class Project(name: String, url: String)

val projectList: List[Project] =
  Play.maybeApplication.map{x =>
    val simpleConfig = x.configration.getObjectList("projects").map{y =>
      y.toList.map{z =>
        Project(z.get("name").toString, z.get("url").toString) // ?!? doesn't work

      ... 
   }}}}}}}}  // *arg*

这种方法似乎很复杂,我迷失了很多Options,我的 Eclipse IDE 无法给我任何关于类的提示。

有没有人举例说明如何从 Hocon 配置文件中读取对象数组?或者我应该为此使用带有 JSON 解析器而不是 Hocon 的 JSON 文件?

4

4 回答 4

9

.maybeApplication以下内容在 Play 2.1.2 中对我有用(虽然我的对象上没有 a ,play.Play但我不确定你为什么这样做):

import play.Play
import scala.collection.JavaConversions._
case class Project(name: String, url: String)

val projectList: List[Project] = {
  val projs = Play.application.configuration.getConfigList("projects") map { p => 
    Project(p.getString("name"), p.getString("url")) }
  projs.toList
}

println(projectList)

给出输出:

List(Project(SO,http://stackoverflow.com/), Project(google,http://google.com))

没有太大的不同,尽管我也没有在很多情况下迷路Option(再次,与您似乎拥有的 API 不同)。

更重要的是,getConfigList它似乎与您想要做的事情更接近,因为它返回List[play.Configuration],这使您能够在检索时指定类型,而不是诉诸强制转换或.toString()调用。

于 2013-07-25T06:36:48.843 回答
2

你想用这部分来完成y.toList.map{z =>什么?如果你想要一个集合Project作为结果,为什么不这样做:

val simpleConfig = x.configration.getObjectList("projects").map{y =>
   Project(y.get("name").toString, y.get("url").toString)
}

在这种情况下,map操作应该采用ConfigObjectwhich is what yis 的实例。这似乎是您获取Project实例所需的全部内容,因此我不确定您为什么将toListConfigObject(即 a Map)放入 List of 中Tuple2,然后再次对其进行映射。

于 2013-06-19T16:27:32.817 回答
2

如果一个正常的 HOCON 配置然后类似于奇怪的功能回答这将工作

import javax.inject._
import play.api.Configuration

trait Barfoo {
  def configuration: Configuration     
  def projects = for {
    projectsFound <- configuration.getConfigList("projects").toList
    projectConfig <- projectsFound
    name <- projectConfig.getString("name").toList
    url  <- projectConfig.getString("url").toList
  } yield Project(name,url)
}

class Foobar @Inject() (val configuration: Configuration) extends Barfoo

(使用 Play 2.4+ 注入)

于 2016-05-16T15:32:32.003 回答
1

鉴于数组的内容是 Json 并且您有一个案例类,您可以尝试使用Json Play API并以这种方式处理对象。Inception部分应该让它变得微不足道。

于 2013-06-19T16:20:44.250 回答