如何在scala中从类型安全配置构建映射列表的映射
发布时间:2020-12-16 10:00:54 所属栏目:安全 来源:网络整理
导读:假设我有一个包含以下内容的配置文件: 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" :
假设我有一个包含以下内容的配置文件:
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"}] } ] 我想将它作为Scala不可变集合Map [List [Map [String,String]]]检索. 使用下面的代码我只能将它作为HashMaps列表(更确切地说是HashMap的$冒号$冒号)检索,当我尝试迭代它时它会失败.理想情况下,为了完成我的代码,我需要一种方法将HashMap转换为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 } 解决方法
此代码应该能够为您提供所需的内容.
它为您的定制结构构建列表和地图. 最后的reduceLeft,是因为你的json以list,someConfig:[]开头,所以我把它弄平了.如果你想要,你可能已经删除了[],因为它们可能不需要代表你拥有的数据. //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,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(_ ++ _) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |