यह प्रश्न हाल ही में कुछ बार आया है, इसलिए मैं इसे यहां पूछताछ कर रहा हूं। मान लीजिए मैं इस तरह कुछ मामले वर्गों मिल गया है:मेरा कॉम्पॉडक्ट एन्कोडिंग संदिग्ध है
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
}
और मैं एक मूल्य है कि JSON के रूप में इनमें से किसी भी एक circe और निराकार coproducts का उपयोग कर किया जा सकता है सांकेतिक शब्दों में बदलना चाहते हैं।
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))
यह पहली बार में ठीक लग रहा है:
scala> c.asJson
res0: io.circe.Json =
{
"i" : 123,
"b" : false
}
लेकिन समस्या यह है कि मैं एक coproduct एक B
तत्व से युक्त डिकोड नहीं कर सकते हैं, के बाद से किसी भी मान्य JSON दस्तावेज है कि B
के रूप में डीकोड किया जा सकता है भी किया जा सकता है A
के रूप में डीकोड किया गया है, और कोरस-आकार द्वारा प्रदान किए गए उत्पादक डिकोडर्स तत्वों को क्रम में प्रकट करने के क्रम में तत्वों को आज़माते हैं।
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)))
मैं अपने एन्कोडिंग में अपने प्रोडक्ट के तत्वों को कैसे बांट सकता हूं?