Почему мое различающее поле не добавляется в мой закодированный объект case с использованием circe? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть следующий код, который я ожидаю напечатать тип кодируемого объекта, но он печатает только пустой объект:

import cats.syntax.functor._
import io.circe.generic.auto._
import io.circe.generic.extras.Configuration
import io.circe.syntax._
import io.circe.{Decoder, Encoder}

object Main extends App {

  implicit val customConfig: Configuration = 
    Configuration.default.withDefaults.withDiscriminator("type")

  sealed trait Foo

  final case object Bar extends Foo
  final case object Boo extends Foo

  implicit val encodeEvent: Encoder[Foo] = Encoder.instance {
    case Bar => Bar.asJson
    case Boo => Boo.asJson
  }

  implicit val decodeEvent: Decoder[Foo] =
    List[Decoder[Foo]](
      Decoder[Bar.type].widen,
      Decoder[Boo.type].widen,
    ).reduceLeft(_ or _)

   val bar = Bar

   println((bar: Foo).asJson.noSpaces) // {}
}

Почему Configuration не применяется ккодировка моего Foo?

1 Ответ

0 голосов
/ 28 ноября 2018

Работает следующее:

import cats.syntax.functor._
import io.circe.generic.extras.semiauto._
import io.circe.generic.extras.Configuration
import io.circe.syntax._
import io.circe.{Decoder, Encoder}

object Main extends App {

  implicit val customConfig: Configuration =
    Configuration.default.withDefaults.withDiscriminator("type")

  sealed trait Foo

  final case object Bar extends Foo
  final case object Boo extends Foo

  implicit val eBar: Encoder[Bar.type] = deriveEncoder[Bar.type]
  implicit val eBoo: Encoder[Boo.type] = deriveEncoder[Boo.type]


  implicit val dBar: Decoder[Bar.type] = deriveDecoder[Bar.type]
  implicit val dBoo: Decoder[Boo.type] = deriveDecoder[Boo.type]

  implicit val encodeEvent: Encoder[Foo] = deriveEncoder[Foo]

  implicit val decodeEvent: Decoder[Foo] =
    List[Decoder[Foo]](
      Decoder[Bar.type].widen,
      Decoder[Boo.type].widen,
    ).reduceLeft(_ or _)

  val foo: Foo = Boo: Foo

  println(foo.asJson.noSpaces) // {"type":"Boo"}
}

На что следует обратить внимание:

  1. Configuration (насколько мне известно) для io.circe.generic.extras.semiauto а не для io.circe.generic.auto
  2. Вы указали Encoder и не дали ему (полу) автоматического вывода.В то время как конфигурация для (полу) автоматического деривации.
...