假设我有一个包含以下内容的配置文件:
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
}
答案 0 :(得分:3)
此代码应该能够为您提供所需内容。
它为您的定制结构构建列表和地图。
最后的reduceLeft,是因为你的json以列表开头,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, 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(_ ++ _)
答案 1 :(得分:0)
如果您像这样在application.conf中使用配置
someConfig{
list1{
value1 = "myvalue1"
value2 = "myvalue2"
.....
valueN = "myvalueN"
}
list2{
......
}
.....
listN{
......
}
}
您可以执行以下操作:
val myconfig = ConfigFactory.load().getObject("someConfig.list1").toConfig
,然后您可以访问类似的值
myconfig.getString("value1")
myconfig.getString("value2")
等
将返回字符串“ myvalue1”,“ myvalue2”
不是最优雅的方式,但简单易行