デフォルト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
がConfigValue
を変換し、読むことができます再帰的にAny
になります。
答えはyesです。可能であれば、pureconfigにAny
の読み方を教えてください。
Any
のコーデックをpureconfigで提供しない理由は、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)
をして、直和値またはカスタムコーデックを抽出するために、デフォルトの方法を使用する:あなたはタイプの制限されたセットを期待していることを知ったとき、あなたが記載されているもののように、あなたは、副生成物のすべてをラップすることができます副生成物の代わりに、Any
を使用して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())))
は何かが、あなたがやっていることに問題がある場合variable
は、コンパイラの助けあなたを持って聞かせできる値を制限します。
ありがとうございます!優れた深遠な答え!賞品を受け取るのを待っています... –
@YordanGeorgiev、私は、ボーナスを明示的に指定しない限り、あなたがすでに正しい答えを選択した後でボーナスを開始したため、自動的に割り当てられない可能性があります。 – SergGr
Tnx!私も疑問を抱いていた... –