[英]Typesafe config: get as map
googlesheets{
dmkb_sheet = "1xEC8CPlKn654321wcoS_JB12345cPPiaA0M"
other_sheet = "123isS0M30TH3R1D"
}
我想使用類似myConfig.getAsMap("googlesheets")
的東西,並將兩個嵌套條目作為 Map 獲取。不存在這樣的方法。 那么將兩個嵌套條目加載為 Map 的最簡單方法是什么?
對於簡單的一些定義,你可以使用這樣的東西:
val config = conf.atKey("googlesheets")
config.root.keySet.asScala.map(key ⇒ key → config.getString(key)).toMap
我認為使用庫將配置映射到 case 類會更容易,比如pureconfig
好的,這很容易。
myConfig.getConfig("googlesheets").entrySet()
可以解決問題
(我專注於具有“get”前綴的方法,所以錯過了)
謝謝。 我通過按如下方式重新編寫您的答案使其工作:
config.entrySet().asScala.map(e => e.getKey -> e.getValue.render()).toMap
我在 scala Map[String, String]
之后 @Senthil 的答案最接近我的答案,但是引用了 Map 值,即它們用雙引號括起來,這導致了一個不容易發現的嚴重錯誤。 我能夠解決它的方法是通過執行configValue.unwrapped().toString()
而不是configValue.render()
在此之前,我嘗試使用各種ConfigRenderOptions
進行render()
但我沒有得到想要的結果
config
.getConfig("<key>")
.entrySet()
.asScala
.map(e => e.getKey -> e.getValue.unwrapped().toString)
.toMap
我在 scala 中使用它,因此將其轉換為 scala 類型
las,typesafe config 本來是一個很酷的庫,卻不得不將 config 設置為 Map 如此困難!
如果有人希望將整個配置讀取為Map[String, Any]
那么可以通過以下遞歸來實現以下內容。
def configAsMap(config: Config): Map[String, Any] = {
config
.entrySet()
.asScala
.map { entry =>
entry.getKey -> unwrappedValue(entry.getValue)
}
.toMap
}
def unwrappedValue(value: ConfigValue): Any = value match {
case l: ConfigList => l.asScala.map(cv => unwrappedValue(cv))
case o: ConfigObject => configAsMap(o.toConfig)
case v => v.unwrapped()
}
它會將配置列表加載到 Scala Seq
和配置對象中作為Map[String, ?]
。 如果具有如下配置結構,這將很有用
foo = []
foo += {bar: Bar}
foo += {zoo: Zoo}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.