我已经阅读了关于在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类型的var(意图迭代其“value”Map属性的元素),我得到编译时错误“无法从此位置访问SimpleConfigObject”。
如何遍历group_1,...,group_n元素并单独访问每个条目值的名称,网址和部分内容?
提前感谢一百万! ;)
答案 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))
我希望这是你想要做的。