Bu soru birkaç kez gündeme geldi, bu yüzden burada SSS yapıyorum. Böyle bir durumda sınıfları var varsayalım:Coproduct kodlamasım belirsiz
import io.circe._, io.circe.generic.semiauto._
object model {
case class A(a: String)
case class B(a: String, i: Int)
case class C(i: Int, b: Boolean)
implicit val encodeA: Encoder[A] = deriveEncoder
implicit val encodeB: Encoder[B] = deriveEncoder
implicit val encodeC: Encoder[C] = deriveEncoder
implicit val decodeA: Decoder[A] = deriveDecoder
implicit val decodeB: Decoder[B] = deriveDecoder
implicit val decodeC: Decoder[C] = deriveDecoder
}
Ve circe ve Şekilsiz Koçarpımlar kullanarak JSON olarak bunlardan herhangi birini olabilecek bir değer kodlamak istiyorum.
scala> c.asJson
res0: io.circe.Json =
{
"i" : 123,
"b" : false
}
Ama sorun B
olarak deşifre edilebilir herhangi bir geçerli JSON belge aynı zamanda olabilir çünkü, bir B
eleman içeren bir eşçarpımı deşifre asla olmasıdır:
import io.circe.shapes._, io.circe.syntax._
import shapeless._
import model._
type ABC = A :+: B :+: C :+: CNil
val c: ABC = Coproduct[ABC](C(123, false))
Bu ilk iyi görünüyor A
olarak kodu çözülür, ve circe-şekilleri tarafından temin edilen yardımcı kod çözücüler, elemanları koproductda göründükleri sırayla deneyler.
scala> val b: ABC = Coproduct[ABC](B("xyz", 123))
b: ABC = Inr(Inl(B(xyz,123)))
scala> val json = b.asJson
json: io.circe.Json =
{
"a" : "xyz",
"i" : 123
}
scala> io.circe.jawn.decode[ABC](json.noSpaces)
res1: Either[io.circe.Error,ABC] = Right(Inl(A(xyz)))
nasıl kodlamasında benim birlikte-unsurlarını sorun aşılabilir?