遍历从配置文件加载的复杂 Scala 集合

Iterate through complex Scala collections loaded from config file

我已经阅读了关于在 Scala 中遍历来自配置文件的集合的 SO 上的其他线程,但他们总是假设所讨论的类型是 ConfigList 或 ObjectList。在我的例子中,它是一个更复杂的结构,我不知道如何访问它的元素。

在我的配置文件中,我需要有一组元组,而不是对集合类型过于挑剔。例如,我愿意使用元组列表或 Map[String, List] 等。如下所示(来自 application.conf):

myprogr {
   groupsOfSomeStuff
   {
      group_1 -> {
        name = "name1",
        url = "url1",
        something = "whatever"
      },
      ...,
      group_n -> {
        name = "namen",
        url = "urln",
        something = "whatever"
      }
   }
}

目前使用上面的 conf 文件,我只能打印整个 groupsOfSomeStuff 但我无法访问它的任何单个元素:

var conf = ConfigFactory.load()
println(conf.getObject("myprogr.groupsOfSomeStuff"))

哪个returns:

SimpleConfigObject({"group_1 ->":{"something":"whatever","name":"name1","url":"url1"}, ..., "group_n ->":{"something":"whatever","name":"namen","url":"urln"})

如果我尝试打印 conf.getObjectList 或 conf.getConfList,我会在 运行 时收到错误,因为从 conf 文件中提取的不是列表而是对象。如果我将 conf 文件中的“->”替换为“:”或“=”(因为正如我所写,我对不同类型的集合持开放态度),也会发生同样的情况。

如果我尝试将 conf.getObject("myprogr.groupsOfSomeStuff") 分配给类型为 SimpleConfigObject 的 var(目的是遍历其 "value" 地图属性),我得到一个编译时错误 "SimpleConfigObject is not accessible from this position".

如何遍历 group_1、...、group_n 元素并分别访问名称、url 和每个条目值的某些部分?

提前一百万致谢! ;)

object TestConfig extends App {
  import scala.collection.JavaConverters._
  case class Foo(name: String, url: String, something: String)
  val config = ConfigFactory.parseResources("test.conf")
  val path = "myprogr.groupsOfSomeStuff"
  val fooList: List[Foo] = config.getObject(path).keySet().asScala.map { key =>
    val member = config.getObject(s"$path.$key").toConfig
    Foo(member.getString("name"), member.getString("url"), member.getString("something"))
  }.toList
  println(fooList)
}

它应该打印 List(Foo(name1,url1,whatever), Foo(namen,urln,whatever)) 我希望这就是你想要做的。