遍历从配置文件加载的复杂 Scala 集合
Iterate through complex Scala collections loaded from config file
我已经阅读了关于在 Scala 中遍历来自配置文件的集合的 SO 上的其他线程,但他们总是假设所讨论的类型是 ConfigList 或 ObjectList。在我的例子中,它是一个更复杂的结构,我不知道如何访问它的元素。
在我的配置文件中,我需要有一组元组,而不是对集合类型过于挑剔。例如,我愿意使用元组列表或 Map[String, List] 等。如下所示(来自 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"))
哪个returns:
SimpleConfigObject({"group_1 ->":{"something":"whatever","name":"name1","url":"url1"}, ..., "group_n ->":{"something":"whatever","name":"namen","url":"urln"})
如果我尝试打印 conf.getObjectList 或 conf.getConfList,我会在 运行 时收到错误,因为从 conf 文件中提取的不是列表而是对象。如果我将 conf 文件中的“->”替换为“:”或“=”(因为正如我所写,我对不同类型的集合持开放态度),也会发生同样的情况。
如果我尝试将 conf.getObject("myprogr.groupsOfSomeStuff") 分配给类型为 SimpleConfigObject 的 var(目的是遍历其 "value" 地图属性),我得到一个编译时错误 "SimpleConfigObject is not accessible from this position".
如何遍历 group_1、...、group_n 元素并分别访问名称、url 和每个条目值的某些部分?
提前一百万致谢! ;)
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))
我希望这就是你想要做的。
我已经阅读了关于在 Scala 中遍历来自配置文件的集合的 SO 上的其他线程,但他们总是假设所讨论的类型是 ConfigList 或 ObjectList。在我的例子中,它是一个更复杂的结构,我不知道如何访问它的元素。
在我的配置文件中,我需要有一组元组,而不是对集合类型过于挑剔。例如,我愿意使用元组列表或 Map[String, List] 等。如下所示(来自 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"))
哪个returns:
SimpleConfigObject({"group_1 ->":{"something":"whatever","name":"name1","url":"url1"}, ..., "group_n ->":{"something":"whatever","name":"namen","url":"urln"})
如果我尝试打印 conf.getObjectList 或 conf.getConfList,我会在 运行 时收到错误,因为从 conf 文件中提取的不是列表而是对象。如果我将 conf 文件中的“->”替换为“:”或“=”(因为正如我所写,我对不同类型的集合持开放态度),也会发生同样的情况。
如果我尝试将 conf.getObject("myprogr.groupsOfSomeStuff") 分配给类型为 SimpleConfigObject 的 var(目的是遍历其 "value" 地图属性),我得到一个编译时错误 "SimpleConfigObject is not accessible from this position".
如何遍历 group_1、...、group_n 元素并分别访问名称、url 和每个条目值的某些部分?
提前一百万致谢! ;)
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))
我希望这就是你想要做的。