web-dev-qa-db-ja.com

Hocon:構成ファイルからオブジェクトの配列を読み取ります

Hocon形式conf/application.confの構成を使用するPlayアプリケーション(2.1)を作成しました。

構成にプロジェクトの配列を追加したいと思います。ファイル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構成ファイルからオブジェクトの配列を読み取る方法の例はありますか?または、これにHoconの代わりにJSONパーサーを使用したJSONファイルを使用する必要がありますか?

16
Sonson123

Play 2.1.2では、次のように機能します(ただし、.maybeApplicationオブジェクトに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とは異なります)。

さらに重要なことに、getConfigListList[play.Configuration]を返すため、実行したいことにより近いように見えます。これにより、キャストや.toString()に頼るのではなく、取得時に型を指定できます。呼び出します。

9
Andy MacKinlay

通常のHOCON構成の場合、strangefeaturesと同様に、これは機能します

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+インジェクションを使用)

2
flurdy

この部分y.toList.map{z =>で何を達成しようとしていますか?結果としてProjectのコレクションが必要な場合は、次のようにしてください。

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

この場合、map操作はConfigObjectのインスタンスを取得する必要があります。これはyです。 Projectインスタンスを取得するために必要なのはそれだけのようです。そのため、なぜあなたがtoListConfigObject)をMapしているのかわかりません。 )Tuple2のリストに追加し、さらにそれを再度マッピングします。

2
cmbaxter

配列の内容がJsonであり、ケースクラスがある場合、 Json Play API を使用して、そのようにオブジェクトを操作することができます。 Inception の部分はそれを些細なものにするはずです。

1
Pere Villega