2017-01-23 87 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)) 我希望這是你正在嘗試做的。