Scala 如何使用Circe为任意一种类型创建解码器?

Scala 如何使用Circe为任意一种类型创建解码器?,scala,circe,Scala,Circe,如果您希望接收类型为a或类型为B(a,B])的Json,您如何为其编写解码器 例如,假设您正在为一个外部API构建一个客户端,该API可以使用某种预期的Json结构进行响应: { "fieldA": "value", "fieldB": "value2" } 或者,如果某项操作失败,它将使用带有错误字段的对象进行应答: { "error": "Your request was wrong" } 然后,您希望有一个具有以下结构之一的实例: val-response:String=/

如果您希望接收类型为
a
或类型为
B
a,B]
)的Json,您如何为其编写解码器

例如,假设您正在为一个外部API构建一个客户端,该API可以使用某种预期的Json结构进行响应:

{
  "fieldA": "value",
  "fieldB": "value2"
}
或者,如果某项操作失败,它将使用带有
错误
字段的对象进行应答:

{
  "error": "Your request was wrong"
}
然后,您希望有一个具有以下结构之一的实例:

val-response:String=//来自服务器的响应
val解码值=
解码[Orther[ErrorResponse,ExpectedResponse](response)/(…),您可以通过以下方式为其中一种编写通用解码器:

隐式定义解码器[A,B](隐式A:解码器[A],B:解码器[B]):解码器[A,B]={
val left:Decoder[A,B]]=A.map(left.apply)
valright:Decoder[A,B]=B.map(right.apply)
左还是右
}
注意:对于这种方法,您仍然需要为
a
B
隐式定义解码器。在大多数情况下,使用
deriveDecoder
就足够了