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
是一个求和类型,有两个变体:Left
和 Right
。基本上,这意味着当一个方法 returns Either[A, B]
时,实际结果可以是 either A
or B
分别包裹成Left
或Right
。
Either
通常用于表示可能会失败的操作的结果,其中 Left
是在出错的情况下返回的,而 Right
包含操作的结果成功案例。如果是这种情况,您可能希望对结果进行模式匹配以提取值:
executeRequest().map { response =>
response.body match {
case Right(body) =>
read[AccessTokenResponse](body).access_token
case Left(err) =>
// Handle the error here
}
}
我正在使用 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
是一个求和类型,有两个变体:Left
和 Right
。基本上,这意味着当一个方法 returns Either[A, B]
时,实际结果可以是 either A
or B
分别包裹成Left
或Right
。
Either
通常用于表示可能会失败的操作的结果,其中 Left
是在出错的情况下返回的,而 Right
包含操作的结果成功案例。如果是这种情况,您可能希望对结果进行模式匹配以提取值:
executeRequest().map { response =>
response.body match {
case Right(body) =>
read[AccessTokenResponse](body).access_token
case Left(err) =>
// Handle the error here
}
}