迭代从配置文件

时间:2017-01-23 19:59:32

标签: scala config scala-collections

我已经阅读了关于在Scala中从配置文件中迭代集合的其他线程,但他们总是假设有问题的类型是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"))

返回:

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类型的v​​ar(意图迭代其“value”Map属性的元素),我得到编译时错误“无法从此位置访问SimpleConfigObject”。

如何遍历group_1,...,group_n元素并单独访问每个条目值的名称,网址和部分内容?

提前感谢一百万! ;)

1 个答案:

答案 0 :(得分:1)

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)) 我希望这是你想要做的。