【问题标题】:How to build a Map of lists of map from type safe config in scala如何从scala中的类型安全配置构建地图列表的地图
【发布时间】:2016-11-27 23:05:57
【问题描述】:

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

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]]]。

使用以下代码,我只能将其作为 HashMap 列表(更准确地说是 HashMap 的 $colon$colon)检索,当我尝试遍历它时失败。理想情况下,要完成我的代码,我需要一种将 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
}

【问题讨论】:

    标签: scala


    【解决方案1】:

    如果你像这样在 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”

    不是最优雅的方式,但很简单

    【讨论】:

      【解决方案2】:

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

      它为您的定制结构建立列表和地图。

      最后一个 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(_ ++ _)
      

      【讨论】:

      • 您可以利用scala.collection.JavaConverters 更巧妙地处理 Java 到 Scala 的转换。
      猜你喜欢
      • 2019-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-21
      • 2021-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多