首页 文章

如何在scala中从类型安全配置构建映射列表的映射

提问于
浏览
4

假设我有一个包含以下内容的配置文件:

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
}

1 回答

  • 3

    此代码应该能够为您提供所需的内容 .

    它为您的定制结构构建列表和 Map .

    最后的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, 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(_ ++ _)
    

相关问题