2017-01-23 16 views
0

からロードされた複雑なScalaコレクションを繰り返します。Scalaの設定ファイルからのコレクションを繰り返し処理することについては、他のスレッドも読んでいますが、問題の型は常にConfigListまたはObjectListです。私の場合、それはより複雑な構造であり、その要素にアクセスする方法を理解できませんでした。設定ファイル

私の設定ファイルでは、コレクションタイプにあまり気を使わずにタプルのグループを作成する必要があります。例えば、私は(application.confから)次のようになどのタプルのリストや地図[文字列、リスト]を、使用して開いている:

myprogr { 
    groupsOfSomeStuff 
    { 
     group_1 -> { 
     name = "name1", 
     url = "url1", 
     something = "whatever" 
     }, 
     ..., 
     group_n -> { 
     name = "namen", 
     url = "urln", 
     something = "whatever" 
     } 
    } 
} 

現時点では上記のconfファイルで、私は、全体groupsOfSomeStuffを印刷することができますが、私はその個々の要素のいずれかにアクセスすることはできません。

var conf = ConfigFactory.load() 
println(conf.getObject("myprogr.groupsOfSomeStuff")) 

返します

SimpleConfigObject({"group_1 ->":{"something":"whatever","name":"name1","url":"url1"}, ..., "group_n ->":{"something":"whatever","name":"namen","url":"urln"}) 

私はconf.getObを印刷しようとした場合をjectListまたはconf.getConfList実行時にエラーが発生するconfファイルから抽出されるものはリストではなくオブジェクトです。 confファイルの " - >"を ":"または "="で置き換えると同じことが起こります(私が書いたように、私はさまざまな種類のコレクションを公開しています)。

私はタイプSimpleConfigObjectのVARにconf.getObject(「myprogr.groupsOfSomeStuff」)を割り当てようとした場合(その「値」マップ属性のエレメントの繰り返し処理を実行することを意図して)、私は、コンパイルを取得"SimpleConfigObjectはこの位置からアクセスできません"。

どのようにしてgroup_1、...、group_n要素を反復処理し、各エントリの値の名前、URL、その他の部分に個別にアクセスできますか?

ありがとうございました! ;)

答えて

1
object TestConfig extends App { 
    import scala.collection.JavaConverters._ 
    case class Foo(name: String, url: String, something: String) 
    val config = ConfigFactory.parseResources("test.conf") 
    val path = "myprogr.groupsOfSomeStuff" 
    val fooList: List[Foo] = config.getObject(path).keySet().asScala.map { key => 
    val member = config.getObject(s"$path.$key").toConfig 
    Foo(member.getString("name"), member.getString("url"), member.getString("something")) 
    }.toList 
    println(fooList) 
} 

それは私は、これはあなたがやろうとしているものであると思いますList(Foo(name1,url1,whatever), Foo(namen,urln,whatever)) を印刷する必要があります。