Можно ли заставить полуавтоматические декодеры учитывать значения по умолчанию для полей класса дел? - PullRequest
0 голосов
/ 30 января 2019

Можно ли заставить полуавтоматические декодеры учитывать значения по умолчанию для полей класса случая?

Следующий код не будет работать с:

Left(DecodingFailure(Attempt to decode value on failed cursor, List(DownField(isActive))))

Я думал, что Circe будетрассмотрим значение по умолчанию для поля класса дела isActive

case class Person(
  id: Option[Int] = None,
  name: String,
  isActive: Boolean = true
)

implicit val personJsonDecoder: Decoder[Person] = deriveDecoder

val rawJson = """
{
  "name": "Geovanny Junio"
}
"""

val r = for {
  j <- parse(rawJson)
  p <- j.as[Person]
} yield p

println(r)

1 Ответ

0 голосов
/ 30 января 2019

Да, но вам потребуются дополнительные функции circe-generic:

import io.circe.Decoder
import io.circe.generic.extras.Configuration
import io.circe.generic.extras.semiauto.deriveDecoder

case class Person(
  id: Option[Int] = None,
  name: String,
  isActive: Boolean = true
)

object Person {
  implicit val personConfig: Configuration =
    Configuration.default.withDefaults
  implicit val personJsonDecoder: Decoder[Person] = deriveDecoder
}

А затем:

scala> io.circe.jawn.decode[Person]("""{"name": "Geovanny Junio"}""")
res0: Either[io.circe.Error,Person] = Right(Person(None,Geovanny Junio,true))

Я собирался добавить эту функцию в производную Circe, но у меня не было времени, поэтому circe-generic-extras - это единственный способ заставить его работать на данный момент (если не считать написания собственного декодера).

...