Scala 如何将ConfigValue转换为typesafeconfig中的列表[ConfigObject]

Scala 如何将ConfigValue转换为typesafeconfig中的列表[ConfigObject],scala,typesafe-config,Scala,Typesafe Config,我不熟悉Scala和typesafeconfig。我有以下问题: 我有一个这样的配置- a = [ { b1 = [ { c1 = 3, c2 = 4 }, { c1 = 3, c2 = 21 } ] }, { b2 = [ {

我不熟悉Scala和typesafeconfig。我有以下问题: 我有一个这样的配置-

a = [
      {
        b1 = [
          { 
            c1 = 3, 
            c2 = 4
          }, {
            c1 = 3, 
            c2 = 21
          }
        ]
      }, {
        b2 = [
          {
            c1 = 10, 
            c2 = 56
          }, 
          # ...many more elements
        ]
      }
      # .
      # .
      # .many more elements
    ]
我已经能够使用以下代码将上述内容放入映射[String,ConfigValue]:

val list : Iterable[ConfigObject] = config.getObjectList(PathTo 'a').asScala

val pairs = for {
  item: ConfigObject <- list
  entry : Entry[String, Config] <- item.entrySet().asScala
  key = entry.getKey
  value = entry.getValue.atKey(key)
 } yield (key, value)

pairs.toMap
val list:Iterable[ConfigObject]=config.getObjectList(路径为'a').asScala
val pairs=用于{

项:ConfigObject方法
toMap
在类型为
collection[(K,V)]
(2元组的集合)的集合上找到,它返回一个
映射[K,V]
。重复键将丢失。不要调用
对。toMap
,您需要根据其键对每个值进行分组,首先:

pairs.groupBy(_._1)         // produces a Map[String, Array[(String, ConfigValue)]
  .mapValues(_.map(_._1))   // produces a Map[String, Array[ConfigValue] 

这将使您能够根据需要迭代配置。

就个人而言,我真的不喜欢Java typesafe配置对象上的接口。这看起来是一个很好的库,可以为Java对象添加更多scala友好的接口:

要解析您的值,需要的所有代码如下:

val config = ConfigFactory.parseString(
  """
    |a = [
    |      {
    |        b1 = [
    |          {
    |            c1 = 3,
    |            c2 = 4
    |          }, {
    |            c1 = 3,
    |            c2 = 21
    |          }
    |        ]
    |      }, {
    |        b2 = [
    |          {
    |            c1 = 10,
    |            c2 = 56
    |          },
    |          # ...many more elements
    |        ]
    |      }
    |      # .
    |      # .
    |      # .many more elements
    |    ]
  """.stripMargin)

import net.ceedubs.ficus.Ficus._

val myComplicatedStructure = config.as[List[Map[String, List[Map[String, Int]]]]]("a")
println(myComplicatedStructure)

// prints List(Map(b1 -> List(Map(c2 -> 4, c1 -> 3), Map(c2 -> 21, c1 -> 3))), Map(b2 -> List(Map(c2 -> 56, c1 -> 10))))
如果您不想添加另一个库,这将作为java中的一次性解析器工作:

  val myComplicatedStructureFromJava = config.getConfigList("a").asScala.toList.map{ relativeConfig =>

  relativeConfig.root().entrySet().asScala.map { entry =>

    val key = entry.getKey

    val configList2 = relativeConfig.getConfigList(key).asScala.toList

    key -> configList2.map{ relativeConfig2 =>

      relativeConfig2.root().entrySet().asScala.map{ entry2 =>

        val key2 = entry2.getKey

        key2 -> relativeConfig2.getInt(key2)

      }.toMap

    }
  }.toMap
}

println(myComplicatedStructureFromJava)

// prints List(Map(b1 -> List(Map(c2 -> 4, c1 -> 3), Map(c2 -> 21, c1 -> 3))), Map(b2 -> List(Map(c2 -> 56, c1 -> 10))))

// or, if you just want a List[Map[String, List[Config]]]

val myComplicatedStructureFromJava2: List[Map[String, List[Config]]] = config.getConfigList("a").asScala.toList.map{ relativeConfig =>

  relativeConfig.root().entrySet().asScala.map { entry =>

    val key = entry.getKey

    val configList2 = relativeConfig.getConfigList(key).asScala.toList

    key -> configList2
  }.toMap
}

println(myComplicatedStructureFromJava2)

// List(Map(b1 -> List(Config(SimpleConfigObject({"c1":3,"c2":4})), Config(SimpleConfigObject({"c1":3,"c2":21})))), Map(b2 -> List(Config(SimpleConfigObject({"c1":10,"c2":56})))))

我理解你的观点,但我不想在代码库中包含一个我是新来的库:)可以理解。我只是想了解一下愚蠢的java API。我们来看看我是否能写一些有用的东西。你想要的最后一种类型是
List[Map[String,List[Map[String,Int]]