1

我知道这与 Scala pureconfig 的本质背道而驰……但是……使用 scala pureconfig 配置读取这个案例类是否可行,而不是为构造函数使用强类型值(作为字符串)参数“变量”具有任何类型或至少为 String、Integer、Double、Array[Strings]、Array[Integer]、Array[Double]。

  case class Filter(
  field: String,
  operator: String,
  variable: String  // should support Int , Double , List[String], List[Int]
  )

据我所知,CoProductHint 和 Custom Reader 方法都不起作用......

4

2 回答 2

5

默认情况下,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如果您正在做的事情有问题,让编译器帮助您。

于 2017-11-29T15:50:47.993 回答
0

您可以制作该字段ANY:示例:

scala>   case class Filter(
     |   field: String,
     |   operator: String,
     |   variable: Any  // should support Int , Double , List[String], List[Int]
     |   )
defined class Filter

scala> Filter("anurag","data",List(12,34))
res5: Filter = Filter(anurag,data,List(12, 34))

scala> Filter("anurag","data",List(12.12,34.12))
res6: Filter = Filter(anurag,data,List(12.12, 34.12))

scala> Filter("anurag","data",List("Hello","Hii"))
res8: Filter = Filter(anurag,data,List(Hello, Hii))
于 2017-11-29T12:24:07.413 回答