scala – 具有对象键的记录的Circe通用编解码器派生
发布时间:2020-12-16 18:36:44 所属栏目:安全 来源:网络整理
导读:我正在尝试实现类似的东西 object Claims { import shapeless._ import shapeless.labelled.FieldType import io.circe._ import io.circe.generic.semiauto._ import java.util.UUID type ClaimOf[V] = FieldOf[V] object iss extends ClaimOf[String] obje
我正在尝试实现类似的东西
object Claims { import shapeless._ import shapeless.labelled.FieldType import io.circe._ import io.circe.generic.semiauto._ import java.util.UUID type ClaimOf[V] = FieldOf[V] object iss extends ClaimOf[String] object subj extends ClaimOf[String] object aud extends ClaimOf[Set[String]] object client_id extends ClaimOf[UUID] implicit val encoder = deriveEncoder[FieldType[iss.type,String] :: FieldType[subj.type,String] :: HNil] } 它不会编译错误 解决方法
根据
Travis Brown,问题是“泛型推导旨在与Shapeless的通用实例一起使用,并期望FieldType键成为符号.”
See discussion on Gitter.
我的解决方案 object Claims { import shapeless._ import shapeless.labelled.FieldType import io.circe._ import io.circe.syntax._ import io.circe.generic.semiauto._ import io.circe.generic.encoding.DerivedObjectEncoder import java.util.UUID abstract case class ClaimOf[V](name: String) extends FieldOf[V] object iss extends ClaimOf[String]("iss") object subj extends ClaimOf[String]("subj") object aud extends ClaimOf[Set[String]]("aud") object client_id extends ClaimOf[UUID]("client_id") implicit final def encodeClaims[K,H,T <: HList](implicit key: Witness.Aux[K],claim: K <:< ClaimOf[H],encodeHead: Lazy[Encoder[H]],encodeTail: Lazy[DerivedObjectEncoder[T]] ): DerivedObjectEncoder[FieldType[K,H] :: T] = new DerivedObjectEncoder[FieldType[K,H] :: T] { final def encodeObject(a: FieldType[K,H] :: T): JsonObject = a match { case h :: t => (key.value.name -> encodeHead.value(h)) +: encodeTail.value.encodeObject(t) } } val encoder = deriveEncoder[FieldType[iss.type,String] :: HNil] val rec = (iss ->> "issuer") :: (subj ->> "subject") :: HNil val json = rec.asJson.spaces2 } encodeClaims函数基本上是来自circe的原始函数的副本,取代了对键的约束. This answer可用于实现另一种解决方案. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |