为什么我的鉴别字段没有使用 circe 添加到我的编码案例对象中?
Why isn't my discriminating field being added to my encoded case object using circe?
我有以下代码,我希望它打印被编码对象的类型,但它只打印一个空对象:
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
的编码?
以下内容有效:
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"}
}
需要注意的事项是:
Configuration
是(据我所知)io.circe.generic.extras.semiauto
而不是 io.circe.generic.auto
- 您提供了一个
Encoder
并且没有让它(半)自动派生。而配置是为了(半)自动推导。
我有以下代码,我希望它打印被编码对象的类型,但它只打印一个空对象:
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
的编码?
以下内容有效:
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"}
}
需要注意的事项是:
Configuration
是(据我所知)io.circe.generic.extras.semiauto
而不是io.circe.generic.auto
- 您提供了一个
Encoder
并且没有让它(半)自动派生。而配置是为了(半)自动推导。