2016-07-24 6 views
2

Let bauen sagen, dass ich eine Config-Datei mit folgendem habe:Wie man eine Karte von Listen der Karte von Typ sicher config in scala

someConfig: [ 
{"t1" : 
    [ {"t11" : "v11", 
    "t12" : "v12", 
    "t13" : "v13", 
    "t14" : "v14", 
    "t15" : "v15"}, 

    {"t21" : "v21", 
    "t22" : "v22", 
    "t23" : "v13", 
    "t24" : "v14", 
    "t25" : "v15"}] 
    }, 
"p1" : 
    [ {"p11" : "k11", 
    "p12" : "k12", 
    "p13" : "k13", 
    "p14" : "k14", 
    "p15" : "k15"}, 

    {"p21" : "k21", 
    "p22" : "k22", 
    "p23" : "k13", 
    "p24" : "k14", 
    "p25" : "k15"}] 
    } 
] 

Ich möchte es als Scala unveränderliche Sammlung Karte abrufen [Liste [Karte [Zeichenfolge, Zeichenfolge]]].

mit dem folgenden Code kann ich nur abrufen, wie eine Liste von HashMaps (genauer gesagt ein $ Doppelpunkt Doppelpunkt von HashMap), die fehlschlägt, wenn ich versuche, durch es durchlaufen. Im Idealfall muss meinen Code vervollständigen ich einen Weg, um die HashMap scala Karten sollten Sie in der Lage Dieser Code

def example: Map[String, List[Map[String,String]]] = { 
    val tmp = ConfigFactory.load("filename.conf") 
    val mylist : Iterable[ConfigObject] = tmp.getObjectList("someConfig") 
     .asScala 
    (for { 
      item : ConfigObject <- mylist 
      myEntry: Entry[String, ConfigValue] <- item.entrySet().asScala 
      name = entry.getKey 
      value = entry.getValue.unwrapped() 
      .asInstanceOf[util.ArrayList[Map[String,String]]] 
      .asScala.toList 
     } yield (name, value)).toMap 
} 

Antwort

2

konvertieren zu geben, was Sie suchen.

Es erstellt Listen und Karten für Ihre maßgeschneiderte Struktur.

Die letzte reduceLeft, ist, weil Ihr JSON mit einer Liste, SomeConfig: [] beginnt, und so habe ich das ausgeflacht. Wenn Sie wollten, hätten Sie wahrscheinlich die [] 's entfernt, da sie wahrscheinlich nicht die Daten darstellen müssen, die Sie haben.

//These methods convert from Java lists/maps to Scala ones, so its easier to use 
private def toMap(hashMap: AnyRef): Map[String, AnyRef] = hashMap.asInstanceOf[java.util.Map[String, AnyRef]].asScala.toMap 
private def toList(list: AnyRef): List[AnyRef] = list.asInstanceOf[java.util.List[AnyRef]].asScala.toList 

val someConfig: Map[String, List[Map[String, String]]] = 
    config.getList("someConfig").unwrapped().map { someConfigItem => 
    toMap(someConfigItem) map { 
     case (key, value) => 
     key -> toList(value).map { 
      x => toMap(x).map { case (k, v) => k -> v.toString } 
     } 
    } 
    }.reduceLeft(_ ++ _) 
Verwandte Themen