scala - 如何使用 Circe 为 Either 类型创建解码器?

标签 scala circe

如果您希望收到类型为 A 或类型为 B (Either[A, B]) 的 Json,如何你能为它写一个解码器吗?

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

{
  "fieldA": "value",
  "fieldB": "value2"
}

或者如果某事失败,它将用一个带有error字段的对象来回答:

{
  "error": "Your request was wrong"
}

然后你想要一个具有这些结构之一的实例:

val response: String = // Response from the server 
val decodedValue =
  decode[Either[ErrorResponse, ExpectedResponse](response) // (...) <- What implicit to place here?

如何为一种响应结构或另一种响应结构编写解码器?

最佳答案

来自 Circe issue 672 ,您可以通过以下方式为 Either 编写通用解码器:

implicit def eitherDecoder[A, B](implicit a: Decoder[A], b: Decoder[B]): Decoder[Either[A, B]] = {
  val left:  Decoder[Either[A, B]]= a.map(Left.apply)
  val right: Decoder[Either[A, B]]= b.map(Right.apply)
  left or right
}

注意:对于这种方法,您仍然需要为AB 隐式定义一个解码器。在大多数情况下,使用 deriveDecoder 就足够了。

关于scala - 如何使用 Circe 为 Either 类型创建解码器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61495083/

相关文章:

json - 如何在不消除对象歧义的情况下使用 circe 解码 ADT

json - 为基本特征具有(密封)类型成员的密封案例类族派生circe Codec

scala - 以 `type` 作为字段的 Scala 案例类的模式匹配

java - 如何以编程方式停止 Spark 作业执行

scala - 如何解决该异常:java.math.BigDecimal不是在doubled模式上重新在datadframe上应用模式时有效的外部类型?

scala - 缺少非详尽匹配的警告

scala - Scala 的 "type"关键字是什么意思?

scala - 在 spark 代码中使用配置文件管理 conf.setMaster() 以自动设置本地或 yarn 集群

scala - 案例类中的解码圆数组总是无法通过案例类比较测试?