如何使用PureConfig读取编码为列表/数组的元组?
解决方案
要让PureConfig将配置中的嵌套列表映射为三元组列表,关键是自定义针对三元组(Int, Double, String)的ConfigReader,因为PureConfig默认不支持将列表直接解析为元组。以下是具体实现步骤:
1. 自定义三元组的ConfigReader
编写一个ConfigReader,识别配置中长度为3的列表,将元素依次解析为Int、Double、String后组合成三元组:
import pureconfig._ import pureconfig.generic.auto._ import com.typesafe.config.{ConfigFactory, ConfigList} import pureconfig.error.WrongType implicit val tripleReader: ConfigReader[(Int, Double, String)] = ConfigReader.fromConfigValue { case configList: ConfigList if configList.size() == 3 => for { intVal <- ConfigReader[Int].from(configList.get(0)) doubleVal <- ConfigReader[Double].from(configList.get(1)) stringVal <- ConfigReader[String].from(configList.get(2)) } yield (intVal, doubleVal, stringVal) case other => Left(WrongType( expected = "一个包含3个元素的列表(类型依次为Int、Double、String)", actual = other.valueType )) }
2. 定义目标类并加载配置
定义Wrapper类后,PureConfig会自动利用上面的tripleReader解析列表中的每个元素,最终生成Vector[(Int, Double, String)]:
case class Wrapper(foo: Vector[(Int, Double, String)]) // 测试配置 val configContent = """ { foo: [ [1, 1.0, "Good job!"] [2, 2.0, "Excellent job!"] [3, 0.0, "Please play again."] ] } """ // 加载配置 val loadResult = ConfigSource.fromConfig(ConfigFactory.parseString(configContent)).load[Wrapper] // 处理结果 loadResult match { case Right(wrapper) => println(wrapper.foo) case Left(errors) => println("加载失败:" + errors.toList.mkString("\n")) }
原有代码失败原因
你之前使用的zip方法,作用是合并多个针对不同配置键的Reader(比如将读取a键的Reader和读取b键的Reader合并,得到解析(a,b)元组的Reader)。这种方式适用于元组对应配置中的多个字段,而非单个列表结构。当配置是[5, 1.0, "hello"]这种列表时,zip的Reader无法识别,因此执行失败。
内容的提问来源于stack exchange,提问作者bwbecker
相关产品推荐
相关产品推荐

