Как декодировать отсутствующий массив json как пустой список с помощью circe - PullRequest
2 голосов
/ 16 июня 2019

Например, у нас есть некоторый класс дел

case class Foo(a: Int, b: List[String])

И мы хотим десериализовать экземпляр Foo из json {"a": 1}, заменив отсутствующий массив b на Nil

Мы можем создать собственный декодер для такого поведения

implicit val fooDecoder: Decoder[Foo] = (c: HCursor) => 
  for {
    a <- c.downField("a").as[Int]
    b <- c.downField("b").as[Option[List[String]]
  } yield Foo(a, b.getOrElse(Nil))

Но, к сожалению, созданный таким образом декодер не накапливает все ошибки декодирования.

Есть ли способ создать декодер со сбояминакопление или любой способ заменить стандартное поведение десериализации списка в circe?

1 Ответ

1 голос
/ 16 июня 2019

Попробуйте указать по умолчанию значение b: List[String] = Nil, используя circe-generic-extras примерно так

import io.circe.parser._
import io.circe.generic.extras.Configuration
import io.circe.generic.extras.auto._

implicit val config: Configuration = Configuration.default.withDefaults
case class Foo(a: Int, b: List[String] = Nil)
val raw = """{"a": 1}"""
decode[Foo](raw) // res0: Either[io.circe.Error,Foo] = Right(Foo(1,List()))

где

libraryDependencies ++= Seq(
  "io.circe" %% "circe-core" % "0.12.0-M3",
  "io.circe" %% "circe-parser" % "0.12.0-M3",
  "io.circe" %% "circe-generic-extras" % "0.12.0-M3",
  "io.circe" %% "circe-generic" % "0.12.0-M3"
)
...