2016-02-13 2 views
0

Я пытаюсь получить список ints [1,2,3,...] от JSON api, но я вижу, что преобразование в общий тип не работает, и документация Spray показывает только unmarshalling для определенного объекта. Любые идеи о том, как заставить его работать/что делать Google, чтобы получить ответ?Scala, Spray - Unmarshalling to List [Int]

API конечных точек: https://hacker-news.firebaseio.com/v0/newstories.json

import java.io.IOException 

import akka.actor.ActorSystem 
import akka.http.scaladsl.Http 
import akka.http.scaladsl.unmarshalling.Unmarshal 
import akka.stream.ActorMaterializer 
import akka.stream.scaladsl.{Flow, Sink, Source} 
import akka.http.scaladsl.model.{HttpResponse, HttpRequest} 
import com.typesafe.config.ConfigFactory 
import akka.http.scaladsl.model.StatusCodes._ 
import spray.json.DefaultJsonProtocol._ 
import spray.json._ 
import akka.http.scaladsl.client.RequestBuilding 
import scala.concurrent.Future 

object NewsDaemon extends App{ 
    val config = ConfigFactory.load() 

    implicit val system = ActorSystem() 
    implicit val executor = system.dispatcher 
    implicit val materializer = ActorMaterializer() 

    case class HNResultList(items: List[Int]) 

    val hnConnectionFlow: Flow[HttpRequest, HttpResponse, Any] = 
    Http().outgoingConnectionTls(config.getString("services.hnApiHost")) 

    def hnApiRequest (request: HttpRequest) : Future[HttpResponse] = Source.single(request).via(hnConnectionFlow).runWith(Sink.head) 

    hnApiRequest(RequestBuilding.Get("/v0/topstories.json?print=pretty")).flatMap { response => 
     response.status match { 
     case OK => Unmarshal(response.entity).to[List[Int]].map(println) 
     case _ => Unmarshal(response.entity).to[String].flatMap { entity => 
      val error = s"HN API request failed with status code ${response.status} and entity $entity" 
      Future.failed(new IOException(error)) 
     } 
     } 
    } 
} 

ответ

1

Попробуйте с akka.http.scaladsl.marshallers.sprayjson.SprayJsonSupport:

object NewsDaemon extends App with SprayJsonSupport { 
... 
} 

библиотека спрей поддерживает основные JSON типы и коллекции 'вне коробки'.

Вы можете найти реализацию здесь:

  • основных типов: spray.json.BasicFormats
  • коллекция: spray.json.CollectionFormats

Так что вам не придется писать свой собственный JsonFormat (JsonReader/JsonWriter) для этого типов ,

Подробный разбор, как интегрировать распылительную JSON с Акку-клиента вы можете найти здесь: http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0.3/scala/http/common/json-support.html

+0

Спасибо! Теперь работает. –

Смежные вопросы