【问题标题】:Iterate over fields in typesafe config迭代类型安全配置中的字段
【发布时间】:2013-07-10 01:09:33
【问题描述】:

我有 perks.conf:

autoshield {
    name="autoshield"
    price=2
    description="autoshield description"
}
immunity {
    name="immunity"
    price=2
    description="autoshield description"
}
premium {
    name="premium"
    price=2
    description="premium description"
}
starter {
    name="starter"
    price=2
    description="starter description"
}
jetpack {
    name="jetpack"
    price=2
    description="jetpack description"
}

我想在我的应用程序中迭代这样的特权:

val conf: Config = ConfigFactory.load("perks.conf")
val entries = conf.getEntries()
for (entry <- entries) yield {
  Perk(entry.getString("name"), entry.getInt("price"), entry.getString("description"))
}

但是我找不到合适的方法来返回配置中的所有条目。我试过config.root(),但它似乎返回了所有属性,包括系统、akka 和许多其他属性。

【问题讨论】:

标签: scala typesafe


【解决方案1】:

entrySet 折叠树。如果您只想迭代直接子级,请使用:

conf.getObject("perks").asScala.foreach({ case (k, v) => ... })

k 将是“autoshield”和“immunity”,但不是“autoshield.name”、“autoshield.price”等。

这要求您导入scala.collection.JavaConverters._

【讨论】:

  • 这应该是公认的答案。 JavaConversions 非常有用。
  • 没有这种方法 :-(
【解决方案2】:

例如,您的Settings.scala 中有以下代码

val conf = ConfigFactory.load("perks.conf")

如果您在根配置(不是conf.root(),而是此配置的根对象)上调用entrySet,它将返回许多垃圾,您需要做的是将所有特权放在特权中的某个路径下.conf:

perks {
  autoshield {
    name="autoshield"
    price=2
    description="autoshield description"
  }
  immunity {
    name="immunity"
    price=2
    description="autoshield description"
  }
}

然后在Settings.scala 文件中获取此配置:

val conf = ConfigFactory.load("perks.conf").getConfig("perks")

然后在此配置上调用 entrySet,您将获得所有条目,而不是来自根对象,而是来自特权。别忘了Typesafe Config是用java写的,entrySet返回java.util.Set,所以需要导入scala.collection.JavaConversions._

【讨论】:

    【解决方案3】:

    getObject 给了我一个合格的 json 对象(例如,timeout.ms = 5 变为 { timeout: { ms: 5 })。

    我最终得到:

    conf.getConfig(baseKey).entrySet().foreach { entry =>
       println(s"${entry.getKey} = ${entry.getValue.unwrapped().toString}")
    }
    

    【讨论】:

      【解决方案4】:
      val common = allConfig.getConfig("column.audit")
         val commonList = common.root().keySet()
            commonList.iterator().foreach( x => { 
            println("Value is :: " + x) 
          }
         )
      

      这应该可行。但是,如果您的密钥集将以不同于 app.conf 的顺序打印。

      例如:

      > cat application.conf
      
      `column {
        audit {
          load_ts = "current_timestamp",
          load_file_nm = "current_filename",
          load_id = "load_id"
        }`
      

      上面的脚本会打印这个:

      Value is :: [load_id, load_ts, load_file_nm]
      

      【讨论】:

        【解决方案5】:

        致任何可能需要它的人:

        val sysProperties = System.getProperties
        val allConfig = ConfigFactory.load("perks.conf")
        val appConfig = allConfig.entrySet().filter { entry =>
          !sysProperties.containsKey(entry.getKey)
        }
        

        【讨论】:

        • ConfigFactory.parseResourcesAnySyntax("perks.conf") 将只从文件中获取配置而不添加系统属性
        • 你可以使用 ConfigFactory.systemProperties().withFallback(yourConfig)
        猜你喜欢
        • 2016-05-16
        • 2013-10-29
        • 1970-01-01
        • 1970-01-01
        • 2019-04-20
        • 2014-04-27
        • 2017-07-31
        • 2015-06-17
        • 2018-10-25
        相关资源
        最近更新 更多