加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在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(_ ++ _)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读