2017-01-23 2 views
0

Ich habe andere Threads auf SO über Iteration durch Sammlungen von Konfigurationsdateien in Scala gelesen, aber sie immer davon ausgehen, der Typ in Frage ist entweder eine ConfigList oder eine ObjectList. In meinem Fall ist es eine komplexere Struktur und ich konnte nicht herausfinden, wie man auf seine Elemente zugreift.Iterieren durch komplexe Scala-Sammlungen geladen aus der Konfigurationsdatei

In meiner Konfigurationsdatei muss ich eine Gruppe von Tupel haben, ohne auf den Sammlertyp zu empfindlich zu sein. Zum Beispiel, ich bin offen für eine Liste von Tupeln oder eine Map [String, List] zu verwenden, usw. Wie die folgenden (von application.conf):

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

Im Moment mit der conf-Datei oben, ich kann nur drucken, die ganze groupsOfSomeStuff aber ich kann nicht jeder seiner einzelnen Elemente zuzugreifen:

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

, die zurückgibt:

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

Wenn ich versuche, conf.getOb zu drucken jectList oder conf.getConfList Ich bekomme einen Fehler zur Laufzeit, denn was aus der conf-Datei extrahiert wird, ist keine Liste, sondern ein Objekt. Dasselbe passiert, wenn ich das "->" in der conf-Datei durch ":" oder "=" (da, wie ich geschrieben habe, offen für verschiedene Arten von Sammlungen bin).

Wenn ich versuche, conf.getObject („myprogr.groupsOfSomeStuff“) auf einen var vom Typ SimpleConfigObject (mit der Absicht, eine Iteration durch die Elemente der „Wert“ Map-Attribut) zuweisen, erhalte ich eine compile- Zeitfehler "Auf SimpleConfigObject kann von dieser Position aus nicht zugegriffen werden".

Wie kann ich durch die Elemente group_1, ..., group_n iterieren und einzeln auf den Namen, die URL und Teile des Wertes jedes Eintrags zugreifen?

Vielen Dank im Voraus! ;)

Antwort

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) 
} 

Es sollte drucken List(Foo(name1,url1,whatever), Foo(namen,urln,whatever)) Ich hoffe, das ist, was Sie zu tun versuchen.

Verwandte Themen