我以这种方式从远程第三方API获得Json反馈:
val myjson: Future[HttpResponse] = http.singleRequest(HttpRequest(uri = encodedUri))
myjson onComplete {
case Success(response) => sender ! WrappedResponse(response.entity.toJson)
case Failure...
}
案例类WrappedResponse(响应:JsValue)
HttpResponse.entity
包含我的json Feed。是否有可能编组和解组这个Json饲料或仅部分饲料?
其中一个问题是,当我把它发回来包裹json的案例类时,我得到了一些东西:
Error:(38, 78) Cannot find JsonWriter or JsonFormat type class for akka.http.scaladsl.model.ResponseEntity
case Success(response) => sender ! WrappedResponse(response.entity.toJson)
我怎样才能" marshall" Json本身?
更新
我终于以这种方式首先解组数据:
val responseData = sendHttpRequest(encodedUrl)
val bodyAsString = responseData.flatMap { response => Unmarshal(response.entity).to[String] }
bodyAsString onComplete {
case Success(body) => sender ! WrappedResponse(body)
case Failure(response) => response
}
和我的编组:
trait MyJsonMarshaller extends SprayJsonSupport with DefaultJsonProtocol {
implicit val titleDeedResponseFormat = jsonFormat1(WrappedResponse.apply)
}
但"重新申请"编组不起作用
答案 0 :(得分:0)
当然!这是未经测试并根据我自己的项目中的代码进行调整,但您可以执行以下操作:
import akka.http.scaladsl.unmarshalling.Unmarshal
val myResponse: Future[HttpResponse] = http.singleRequest(HttpRequest(uri = encodedUri))
val jsonFut = myResponse.flatMap {
case HttpResponse(StatusCodes.OK, _, entity, _) =>
Unmarshal(entity).to[JsObject]
case other =>
logger.debug(s"Failed response: $other")
throw new Exception(other.toString())
}.recover {
// ... error handling
}
在这种情况下,您将以临时方式处理JsObject
结果。但是,如果为域模型类定义JsonFormat
个实例,则可以直接解组到域对象。