Akka:如何处理返回的Json feed?

时间:2016-08-23 18:31:44

标签: scala akka akka-http spray-json

我以这种方式从远程第三方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)

}

但"重新申请"编组不起作用

1 个答案:

答案 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个实例,则可以直接解组到域对象。