默认情况下,pureconfig 不提供读取Any
. 如果您想阅读特定的类,Any
则可以Any
在该类的上下文中定义编解码器:
case class Filter(field: String, operator: String, variable: Any)
implicit val readFilter = {
implicit val readAny = new ConfigReader[Any] {
def from(config: ConfigValue): Either[ConfigReaderFailures, Any] = {
Right(config.unwrapped())
}
}
ConfigReader[Filter]
}
然后你可以阅读Filter
val config = ConfigFactory.parseString(
"""
{
field: "foo"
operator: "bar"
variable: []
}
""")
println(pureconfig.loadConfig[Filter](config))
// will print Right(Filter(foo,bar,[]))
unwrapped
将 a递归转换ConfigValue
为。Any
所以答案是肯定的,如果可能的话,告诉 pureconfig 如何读取Any
.
pureconfig 默认不提供编解码器的原因Any
是因为Any
它是Scala 中所有类的祖先,不可能为任何东西(例如数据库连接)创建编解码器。当您知道您需要一组受限制的类型时,例如您列出的那些,您可以将所有内容包装在一个副产品中:
sealed abstract class MySupportedType
final case class MyInt(value: Int) extends MySupportedType
final case class MyDouble(value: Double) extends MySupportedType
final case class MyListOfString(value: List[String]) extends MySupportedType
final case class MyListOfInt(value: List[Int]) extends MySupportedType
final case class Filter2(field: String, operator: String, variable: MySupportedType)
然后使用默认方式提取 coproduct 值或自定义编解码器MySupportedType
val config = ConfigFactory.parseString(
"""
{
field: "foo"
operator: "bar"
variable: {
type: mylistofint
value: []
}
}
""")
println(pureconfig.loadConfig[Filter2](config))
// will print Right(Filter2(foo,bar,MyListOfInt(List())))
使用副产品而不是Any
限制可能具有的值,variable
如果您正在做的事情有问题,让编译器帮助您。