gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:07:35 25 4
gpt4 key购买 nike

如果您希望收到类型为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com