Я столкнулся со странной ситуацией.
Я пытаюсь создать метод, который принимает тип и JSON и встраивает его в экземпляр класса case и, при необходимости, автоматически заполняет отсутствующие ключевые значения.
Пока мне удалось сделать все отдельно, но не вместе.
Класс 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)))
и это работает, как я ожидал
но когда я помещаю его в общий метод, он должен был быть вариантом из-за ошибки:
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: DecodingFailure(Attempt to decode value on failed cursor, List(DownField(a)))
поэтому я меняю класс case на
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)
так что теперь я потерял свои значения по умолчанию, которые я установил, и не могу использовать автоматический декодер.
Как мне объединить два моих желания в один подход?