2016-07-24 1 views
2

Disons que j'ai un fichier de configuration avec les éléments suivants:Comment construire une carte des listes de carte de Type config en sécurité dans 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"}] 
    } 
] 

je voudrais le récupérer comme une collection immuable Scala Carte [Liste [Carte [Chaîne, Chaîne]]]. En utilisant le code suivant, je ne peux le récupérer que sous la forme d'une liste de HashMaps (plus précisément un colon $ $ colon de HashMap) qui échoue lorsque j'essaie de l'itérer. Idéalement pour compléter mon code, je besoin d'un moyen de convertir les HashMap aux cartes scala

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 
} 

Répondre

2

Ce code devrait être en mesure de vous donner ce que vous recherchez.

Il construit des listes et des cartes pour votre structure sur mesure. Le dernier reduceLeft, c'est parce que votre json commence avec une liste, someConfig: [], et j'ai donc aplati. Si vous le vouliez, vous auriez probablement pu supprimer les [], car ils n'ont probablement pas besoin de représenter les données dont vous disposez.

//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(_ ++ _)