簡體   English   中英

類型安全配置:獲取為 map

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM