如何从Akka客户端HttpResponse解析json正文

如何从Akka客户端HttpResponse解析json正文,json,scala,akka,akka-http,Json,Scala,Akka,Akka Http,我使用Akka的HTTP客户端库来请求json,我想使用Play框架来解析json。在我得到Akka的HttpResponse之后,我不知道如何从响应体解析json,也不知道如何将json传递给onComplete指令中的另一个函数。相反,我得到了这个错误 overloaded method value parse with alternatives: [error] (input: Array[Byte])play.api.libs.json.JsValue <and> [er

我使用Akka的HTTP客户端库来请求json,我想使用Play框架来解析json。在我得到Akka的HttpResponse之后,我不知道如何从响应体解析json,也不知道如何将json传递给onComplete指令中的另一个函数。相反,我得到了这个错误

overloaded method value parse with alternatives:
[error]   (input: Array[Byte])play.api.libs.json.JsValue <and>
[error]   (input: java.io.InputStream)play.api.libs.json.JsValue <and>
[error]   (input: String)play.api.libs.json.JsValue
[error]  cannot be applied to (scala.concurrent.Future[String])
[error]           val usefulInfo = Json.parse(data)
[error]                                 ^
[error] one error found
[error] (Compile / compileIncremental) Compilation failed
我的问题是:

在将来解析后,如何使用Play Framework的json.parse解析json? 在将来的响应解决后,我如何在其他地方存储或使用此json?在成功案例中,我需要做些什么吗? 主要问题是解组返回一个Future,因此需要在Future中处理数据以获取字符串值

如果要保留结果而不是仅打印结果,请在初始结果上使用TransformWith而不是onComplete:

请注意,如果您将打印保留到最后,这会变得更干净:

val result = Http().singleRequest(request)
  .flatMap { res =>
    Unmarshal(res).to[String].map { data =>
      Json.parse(data)
    }
  }

result.onComplete {
  case Success(js) =>
    println(s"Success: $js")
  case Failure(e) =>
    println(s"Failure: $e")
}

这太棒了!这正是我需要的。那么在这种情况下使用onComplete与transformWith有什么区别呢?transformWith返回一个新的未来,而onComplete不返回任何东西。所以onComplete只对打印或发送消息等副作用有用。你知道在哪里可以找到有关箭头函数的文档吗?在Transform中,您刚刚将usefulInfo作为单个变量留下。这就是箭头函数返回值的方式吗?它是否与scala的函数性质有关?usefulInfo实际上位于传递给对未编组数据的映射调用的函数内部。在第二个例子中,我只是直接返回parse的结果,但在第一个例子中,我需要保留它,以便打印出来,然后作为函数的结果返回。Scala允许非常简洁的代码,但需要一些时间才能习惯!
val result = Http().singleRequest(request)
  .flatMap { res =>
    Unmarshal(res).to[String].map { data =>
      Json.parse(data)
    }
  }

result.onComplete {
  case Success(js) =>
    println(s"Success: $js")
  case Failure(e) =>
    println(s"Failure: $e")
}