Serialization.read() 不在地图块内 "found" [Scala]

Serialization.read() is not "found" inside a map block [Scala]

我正在使用 json4s 处理来自 http 响应的 Json 响应。我之前使用的是 Await 但我现在改用 Future.

我有这样的功能:

executeRequest(): Future[Response[String]]

还有另一个函数,如:

def getAccessToken() = {
 executeRequest().map {
    response: Response[String] => // read method in the next line cannot be resolved
      read[AccessTokenResponse](response.body).access_token
   }
 // the following line is ok
 read[AccessTokenResponse]("{\"access_token\":\"fake_token\"}").access_token
}

现在,map 块内的 read 不再是我的 IntelliJ recognized/found,我假设这意味着我做错了什么。但是 map 块之外的 read 正确解析。

我在这里做错了什么?我是 Scala 的新手:/

编译器输出:

overloaded method value read with alternatives:
  (in: java.io.Reader)(implicit formats: org.json4s.Formats, implicit mf: scala.reflect.Manifest[AccessTokenResponse])AccessTokenResponse <and>
  (json: org.json4s.JsonInput)(implicit formats: org.json4s.Formats, implicit mf: scala.reflect.Manifest[AccessTokenResponse])AccessTokenResponse <and>
  (json: String)(implicit formats: org.json4s.Formats, implicit mf: scala.reflect.Manifest[AccessTokenResponse])AccessTokenResponse
 cannot be applied to (Either[String,String])
      read[AccessTokenResponse](response.body).access_token

您收到的错误意味着 read 方法可以接受以下类型之一的参数:

  • java.io.Reader
  • org.json4s.JsonInput
  • String

此行有效,因为您将 String 传递给 read:

read[AccessTokenResponse]("{\"access_token\":\"fake_token\"}").access_token

但是从报错信息中可以看出,response.body类型是Either[String,String].

Either 是一个求和类型,有两个变体:LeftRight。基本上,这意味着当一个方法 returns Either[A, B] 时,实际结果可以是 either A or B分别包裹成LeftRight

Either 通常用于表示可能会失败的操作的结果,其中 Left 是在出错的情况下返回的,而 Right 包含操作的结果成功案例。如果是这种情况,您可能希望对结果进行模式匹配以提取值:

executeRequest().map { response =>
  response.body match {
    case Right(body) =>
      read[AccessTokenResponse](body).access_token
    case Left(err) =>
      // Handle the error here
  }
}