Scala 如何使用circe定义一些通用解码器/编码器?

Scala 如何使用circe定义一些通用解码器/编码器?,scala,circe,Scala,Circe,假设我有多种类型的ID,定义如下 sealed trait Id { val value: String } case class IdA(value: String) extends Id case class IdB(value: String) extends Id case class IdC(value: String) extends Id 这些类应该从以下JSON解码并编码为以下JSON { "id: "some-id" } 如何为

假设我有多种类型的ID,定义如下

sealed trait Id {
  val value: String
}
case class IdA(value: String) extends Id
case class IdB(value: String) extends Id
case class IdC(value: String) extends Id
这些类应该从以下JSON解码并编码为以下JSON

 {
    "id: "some-id"
 }
如何为id定义一些通用解码器/编码器

case class A(id: IdA, name: String, count: Int)
case class B(id: IdB, name: String, count: Int)
case class C(id: IdC, name: String, count: Int)
这样上面的类就可以从下面的JSON进行解码和编码了

{
   "id" : "some-id",
   "name": "some-name",
   "count": 2
}

如果可能的话,我希望id字段对于解码器和编码器都是灵活的,在一种情况下id可能是“id-x”,在另一种情况下id可能是“id-y”。

我通过简单地定义以下解码器和编码器就解决了这个问题

import cats.implicits._
import io.circe.{Decoder, Encoder}
import shapeless._

 implicit def encoderValueClass[T <: Id, V](implicit
      g: Lazy[Generic.Aux[T, V :: HNil]],
      e: Encoder[V]
  ): Encoder[T] = Encoder.instance { value =>
    e(g.value.to(value).head)
  }

  implicit def idDecoder[T <: Id, V](implicit
      g: Lazy[Generic.Aux[T, V :: HNil]],
      d: Decoder[V]
  ): Decoder[T] = Decoder.instance { cursor =>
    d(cursor).map { value =>
      g.value.from(value :: HNil)
    }
  }
导入cats.implicits_
导入io.circe.{解码器,编码器}
进口不成形_
隐式def encoderValueClass[T
例如(从价值到(价值)头)
}
隐式def idDecoder[T
d(游标).map{value=>
g、 value.from(值::HNil)
}
}

你可以为trait
Id
创建一个自定义的
编解码器
,定义它应该如何工作。你能提供一些示例实现吗?你可以检查一下,我觉得你是在把几个问题混为一谈。哪个json应该解码成哪个类?哪些类应该编码成哪个json?