使用pureconfig读取编码为列表或数组的元组



我想使用PureConfig库读取元组列表。也就是说,我想读

{
foo: [
[1, 1.0, "Good job!"]
[2, 2.0, "Excellent job!"]
[3, 0.0, "Please play again."]
]
}

case class Wrapper(foo:Vector[(Int, Double, String)])

2018年的PureConfig问题很诱人:

将元组视为容器;pair包含两个可能不同类型的值,可以从配置中加载为数组,如[a, B]。你会发现很多用例,你想加载这样一个结构,但由于某种原因不想定义一个新对象——例如,你可以加载一个直方图计数器列表(一个(String, Int)条目的列表),在配置中编码为[[a, 1], [b, 3], [c, 2],…]。

但我还没能想出如何真正做到这一点。

根据我应该先走后跑的理论,我写了下面的代码来尝试读取一个单独的元组,编码为列表/数组:

implicit val tReader: ConfigReader[(Int, Double, String)] = {
ConfigReader[Int].zip(ConfigReader[Double]).zip(ConfigReader[String]).map(x => (x._1._1, x._1._2, x._2))
}
case class Wrapper(foo: (Int, Double, String))
val mi: Result[Wrapper] =
ConfigSource.fromConfig(ConfigFactory.parseString("""foo: [5, 1.0, "hello" ]""")).load[Wrapper]

当它遇到列表符号时失败:[...]

建议欢迎。

pureconfig-magnolia模块可以满足您的需要。它是generic模块的替代品,但与它不同的是,它支持元组。一旦您在构建中添加了它,您所需要做的就是添加相应的导入并为您的包装器类创建一个阅读器。

import pureconfig.module.magnolia.auto.reader.exportReader
case class Wrapper(foo: (Int, Double, String))
implicit val wrapperReader: ConfigReader[Wrapper] =
ConfigReader.exportedReader
val mi: Result[Wrapper] =
ConfigSource
.fromConfig(ConfigFactory.parseString("""foo: [5, 1.0, "hello" ]"""))
.load[Wrapper]

在那里你可以找到一个README文件和这个模块的测试:https://github.com/pureconfig/pureconfig/tree/master/modules/magnolia

最新更新