【发布时间】:2020-06-05 03:12:33
【问题描述】:
我遇到了一个奇怪的情况。
我正在尝试构建一个采用类型和 JSON 的方法
并将其构建到案例类实例中,并在需要时自动完成缺失的键值。
到目前为止,我设法单独做所有事情,但不是全部。
具有默认值的案例类:
case class Foo(a: String = "empty String", b: Option[Int] = Some(1))
当我进行转换时:
import io.circe.generic.extras.auto._
import io.circe.generic.extras.Configuration
import io.circe.parser.decode
implicit val customConfig: Configuration = Configuration.default.withDefaults
println(decode[Foo]("{}"))
这是我得到的输出:
Right(Foo(empty String,Some(1)))
这正如我预期的那样工作
但是当我把它放到一个通用方法中时,由于错误,它需要一个选项:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: DecodingFailure(Attempt to decode value on failed cursor, List(DownField(a)))
所以我将案例类更改为
case class Foo(a: Option[String] = Some("empty String"), b: Option[Int] = Some(1))
并添加解码器:
object Foo{
implicit val decoder:Decoder[Foo] = deriveDecoder[Foo]
}
到方法:
import io.circe.Decoder
import io.circe.parser.decode
def convertToObj[T](jsonStr: String)(implicit decoder: Decoder[T]): T = {
decode[T](jsonStr)
match {
case Right(value) => value
case Left(error) => throw error
}
}
println(convertToObj[Foo]("{}"))
输出是:
Foo(None,None)
所以现在我丢失了我设置的默认值,也无法使用自动解码器。
如何将我的两个愿望合并为一种方法?
【问题讨论】:
-
你是什么意思:“但是当我把它放到一个泛型方法中时,由于错误,它需要一个选项:”?什么通用方法?我是否理解您正在更改您的课程,因为您在“将其放入通用方法”后遇到错误?
-
你理解的没错,我为了让它工作而改变了类,方法是convertToObj[Foo]("{}")