web-dev-qa-db-ja.com

typesafeconfigのフィールドを繰り返し処理します

私は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、その他多くのプロパティを含むすべてのプロパティが返されるようです。

16
Egor Koshelko

たとえば、_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を呼び出すと、ルートオブジェクトからではなく、特典からすべてのエントリを取得します。 TypesafeConfigはJavaで記述され、entrySetは_Java.util.Set_を返すため、_scala.collection.JavaConversions.__をインポートする必要があることを忘れないでください。

20
4lex1v

entrySetはツリーを折りたたみます。直接の子のみを反復処理する場合は、次を使用します。

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

kは「autoshield」と「immunity」になりますが、「autoshield.name」、「autoshield.price」などにはなりません。

これには、scala.collection.JavaConverters._をインポートする必要があります。

35
Yuri Geinish

getObjectは私に修飾されたjsonオブジェクトを与えました(例えば、timeout.ms = 5{ timeout: { ms: 5 }になります)。

私は結局:

conf.getConfig(baseKey).entrySet().foreach { entry =>
   println(s"${entry.getKey} = ${entry.getValue.unwrapped().toString}")
}
1
AlonL
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]
0
Balaji Tr

それを必要とするかもしれない誰にでも:

val sysProperties = System.getProperties
val allConfig = ConfigFactory.load("perks.conf")
val appConfig = allConfig.entrySet().filter { entry =>
  !sysProperties.containsKey(entry.getKey)
}
0
wood