类型安全配置:如何获取列表列表

我有一个具有以下结构的配置文件:

# ExampleConfig
exampleConfig {
  steps = [
    ["app_one","step_one","step_two"],["app_two","step_two"]
  ]
  tags = [
    ["owner","me"],["env","prod"],["tenant","me"]
  ]
}

我想做的是将配置文件加载到应用程序中,然后从配置文件中提取列表(例如步骤、标签)。我对如何做到这一点有些困惑。我尝试使用以下方法,但它们没有返回我想要的结果:

val config: Config = ConfigFactory.load(configFile).getconfig(configValue)
val steps = config.getList("steps")

我想要的最终结果如下:

val steps: List[(String,String,String)] = List(("app_one","step_two"),...))
val tags: List[(String,String)] = List(("owner","me"),("env","prod"),...))
gandernb 回答:类型安全配置:如何获取列表列表

一般情况下,json中不存在元组的概念。因此,您必须在应用程序中强制转换为元组,而不是在 json 中。最后一个含义是,您不能编写可转换任意数量参数的通用代码。

您可以尝试以下操作:

val config = ConfigFactory.parseString(configString)
val steps = config.getList("steps").asScala.map {
  case internalList: ConfigList =>
    if (internalList.size() != 3) ???
    internalList.asScala.map(_.unwrapped()) match {
      case mutable.Buffer(a1,a2,a3) =>
        (a1,a3)
    }
}.toList

val tags = config.getList("tags").asScala.map {
  case internalList: ConfigList =>
    if (internalList.size() != 2) ???
    internalList.asScala.map(_.unwrapped()) match {
      case mutable.Buffer(a1,a2) =>
        (a1,a2)
    }
}.toList

println(steps)
println(tags)

代码在 Scastie 运行。

本文链接:https://www.f2er.com/945086.html

大家都在问