Scala 如何将ConfigValue转换为typesafeconfig中的列表[ConfigObject]
我不熟悉Scala和typesafeconfig。我有以下问题: 我有一个这样的配置-Scala 如何将ConfigValue转换为typesafeconfig中的列表[ConfigObject],scala,typesafe-config,Scala,Typesafe Config,我不熟悉Scala和typesafeconfig。我有以下问题: 我有一个这样的配置- a = [ { b1 = [ { c1 = 3, c2 = 4 }, { c1 = 3, c2 = 21 } ] }, { b2 = [ {
a = [
{
b1 = [
{
c1 = 3,
c2 = 4
}, {
c1 = 3,
c2 = 21
}
]
}, {
b2 = [
{
c1 = 10,
c2 = 56
},
# ...many more elements
]
}
# .
# .
# .many more elements
]
我已经能够使用以下代码将上述内容放入映射[String,ConfigValue]:
val list : Iterable[ConfigObject] = config.getObjectList(PathTo 'a').asScala
val pairs = for {
item: ConfigObject <- list
entry : Entry[String, Config] <- item.entrySet().asScala
key = entry.getKey
value = entry.getValue.atKey(key)
} yield (key, value)
pairs.toMap
val list:Iterable[ConfigObject]=config.getObjectList(路径为'a').asScala
val pairs=用于{
项:ConfigObject方法toMap
在类型为collection[(K,V)]
(2元组的集合)的集合上找到,它返回一个映射[K,V]
。重复键将丢失。不要调用对。toMap
,您需要根据其键对每个值进行分组,首先:
pairs.groupBy(_._1) // produces a Map[String, Array[(String, ConfigValue)]
.mapValues(_.map(_._1)) // produces a Map[String, Array[ConfigValue]
这将使您能够根据需要迭代配置。就个人而言,我真的不喜欢Java typesafe配置对象上的接口。这看起来是一个很好的库,可以为Java对象添加更多scala友好的接口:
要解析您的值,需要的所有代码如下:
val config = ConfigFactory.parseString(
"""
|a = [
| {
| b1 = [
| {
| c1 = 3,
| c2 = 4
| }, {
| c1 = 3,
| c2 = 21
| }
| ]
| }, {
| b2 = [
| {
| c1 = 10,
| c2 = 56
| },
| # ...many more elements
| ]
| }
| # .
| # .
| # .many more elements
| ]
""".stripMargin)
import net.ceedubs.ficus.Ficus._
val myComplicatedStructure = config.as[List[Map[String, List[Map[String, Int]]]]]("a")
println(myComplicatedStructure)
// prints List(Map(b1 -> List(Map(c2 -> 4, c1 -> 3), Map(c2 -> 21, c1 -> 3))), Map(b2 -> List(Map(c2 -> 56, c1 -> 10))))
如果您不想添加另一个库,这将作为java中的一次性解析器工作:
val myComplicatedStructureFromJava = config.getConfigList("a").asScala.toList.map{ relativeConfig =>
relativeConfig.root().entrySet().asScala.map { entry =>
val key = entry.getKey
val configList2 = relativeConfig.getConfigList(key).asScala.toList
key -> configList2.map{ relativeConfig2 =>
relativeConfig2.root().entrySet().asScala.map{ entry2 =>
val key2 = entry2.getKey
key2 -> relativeConfig2.getInt(key2)
}.toMap
}
}.toMap
}
println(myComplicatedStructureFromJava)
// prints List(Map(b1 -> List(Map(c2 -> 4, c1 -> 3), Map(c2 -> 21, c1 -> 3))), Map(b2 -> List(Map(c2 -> 56, c1 -> 10))))
// or, if you just want a List[Map[String, List[Config]]]
val myComplicatedStructureFromJava2: List[Map[String, List[Config]]] = config.getConfigList("a").asScala.toList.map{ relativeConfig =>
relativeConfig.root().entrySet().asScala.map { entry =>
val key = entry.getKey
val configList2 = relativeConfig.getConfigList(key).asScala.toList
key -> configList2
}.toMap
}
println(myComplicatedStructureFromJava2)
// List(Map(b1 -> List(Config(SimpleConfigObject({"c1":3,"c2":4})), Config(SimpleConfigObject({"c1":3,"c2":21})))), Map(b2 -> List(Config(SimpleConfigObject({"c1":10,"c2":56})))))
我理解你的观点,但我不想在代码库中包含一个我是新来的库:)可以理解。我只是想了解一下愚蠢的java API。我们来看看我是否能写一些有用的东西。你想要的最后一种类型是List[Map[String,List[Map[String,Int]]
?