2017-01-23 72 views
0

我已经阅读了关于通过Scala中的配置文件迭代集合的其他线程,但他们始终认为所讨论的类型是ConfigList或ObjectList。就我而言,这是一个更复杂的结构,我无法弄清楚如何访问它的元素。通过从配置文件加载的复杂Scala集合中迭代

在我的配置文件中,我需要有一组元组,而不会对集合类型过于挑剔。举例来说,我愿意用一个元组列表或地图[字符串,列表],等等类似如下(从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.getOb jectList或conf.getConfList我在运行时得到一个错误,导致从conf文件中提取的内容不是一个列表,而是一个对象。如果我在conf文件中用“:”或“=”替换“ - >”(因为正如我写的,我对不同类型的集合开放),情况也会发生同样的情况。

如果我尝试分配conf.getObject(“myprogr.groupsOfSomeStuff”)类型为SimpleConfigObject的VAR(以迭代通过其“价值”地图属性的元素的意图),我得到一个编译期时间错误“SimpleConfigObject无法从此位置访问”。

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

非常感谢! ;)

回答

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)) 我希望这是你正在尝试做的。