Я столкнулся со странной ситуацией. Я пытаюсь создать метод, который принимает тип и JSON и встроить его в экземпляр класса дела и при необходимости автоматически заполнить пропущенные значения ключа. До сих пор мне удавалось делать все по отдельности, но не полностью. Класс case с его значениями по умолчанию:
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)))
и это работает как я ожидал
, но когда я поместил его в обобщенный метод c, он потребовал, чтобы параметр был указан из-за ошибки:
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)
так что теперь я потерял свои значения по умолчанию, которые я установил, и не могу также использовать автоматический c декодер.
Как я могу объединить два моих желания в один подход?