2016-08-23 5 views
0

я фид JSon обратно с удаленного API третьей стороной следующим образом:Akka: Как работать с возвращенным кормом 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. Возможно ли, чтобы Маршвалл и разобрал этот 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) 

Как я могу «маршалом» Json сам?

UPDATE

я, наконец, получить первый маршализацию данные таким образом:

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

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

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

+0

Что вы подразумеваете под «повторным применением» сортировки? Вы испытываете ошибку компилятора? – acjay

+0

Нет, я решил. Мне не нужно снова подавать заявку. – Randomize