Akka: Как работать с возвращенным фидом Json?

Я получаю обратную связь Json от удаленного стороннего API следующим образом:

val myjson: Future[HttpResponse] = http.singleRequest(HttpRequest(uri = encodedUri))

myjson onComplete {
   case Success(response) => sender ! WrappedResponse(response.entity.toJson)
   case Failure...
}

класс case WrappedResponse (ответ: JsValue)

HttpResponse.entity содержит мой канал json. Возможно ли упорядочивать и отменять этот канал Json или только его части?

Одна из проблем заключается в том, что когда я отправляю его обратно, завернув json в класс case, я получаю что-то:

Error:(38, 78) Cannot find JsonWriter or JsonFormat type class for akka.http.scaladsl.model.ResponseEntity
        case Success(response) => sender ! WrappedResponse(response.entity.toJson)

Как я могу «упорядочить» сам 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)

}

но сортировка "повторно применить" не работает


person Randomize    schedule 23.08.2016    source источник


Ответы (1)


Конечно! Это не проверено и адаптировано из кода моего собственного проекта, но вы можете сделать что-то вроде:

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 экземпляров для классов модели предметной области, вы можете выполнить демаршалирование непосредственно к объектам предметной области.

person acjay    schedule 23.08.2016
comment
Что вы подразумеваете под повторным применением сортировки? Вы столкнулись с ошибкой компилятора? - person acjay; 25.08.2016