2016-02-19 61 views
1

我從SprayJsonSupport傳遞到淘金基於this example 一些代碼修改後:

object ElevationJsonProtocol extends DefaultJsonProtocol { 
    implicit val locationCodec: CodecJson[Elevation] = casecodec2(Elevation, Elevation.unapply)("location", "elevation") 
    implicit val elevationCodec: CodecJson[Location] = casecodec2(Location, Location.unapply)("lat", "lng") 
    implicit def googleApiResultCodec: CodecJson[GoogleApiResult] = casecodec2(GoogleApiResult, GoogleApiResult.unapply)("status", "results") 
} 

我得到這個錯誤

Error:(41, 42) not enough arguments for method unmarshal: (implicit evidence$1: spray.httpx.unmarshalling.FromResponseUnmarshaller[GoogleApiResult])spray.http.HttpResponse => GoogleApiResult. Unspecified value parameter evidence$1. val pipeline = sendReceive ~> unmarshal[GoogleApiResult] ^

我看看的解組方法:

def unmarshal[T](implicit evidence$1 : spray.httpx.unmarshalling.FromResponseUnmarshaller[T]) : scala.Function1[spray.http.HttpResponse, T] 

如何添加隱式參數?爲什麼我沒有得到sprayJsonSupport這樣的錯誤?

孔代碼:

import spray.httpx.unmarshalling.FromResponseUnmarshaller 

import scala.util.{Success, Failure} 
import scala.concurrent.duration._ 
import akka.actor.ActorSystem 
import akka.pattern.ask 
import akka.event.Logging 
import akka.io.IO 
import spray.json.{JsonFormat, DefaultJsonProtocol} 
import spray.can.Http 
import spray.httpx.SprayJsonSupport 
import spray.client.pipelining._ 
import spray.util._ 
import argonaut._, Argonaut._ 

case class Elevation(location: Location, elevation: Double) 
case class Location(lat: Double, lng: Double) 
case class GoogleApiResult(status: String, results: List[Elevation]) 

object ElevationJsonProtocol extends DefaultJsonProtocol { 
    implicit val locationCodec: CodecJson[Elevation] = casecodec2(Elevation, Elevation.unapply)("location", "elevation") 
    implicit val elevationCodec: CodecJson[Location] = casecodec2(Location, Location.unapply)("lat", "lng") 
    implicit def googleApiResultCodec: CodecJson[GoogleApiResult] = casecodec2(GoogleApiResult, GoogleApiResult.unapply)("status", "results") 
} 

object Main extends App { 
    // we need an ActorSystem to host our application in 
    implicit val system = ActorSystem("simple-spray-client") 
    import system.dispatcher // execution context for futures below 
    val log = Logging(system, getClass) 

    log.info("Requesting the elevation of Mt. Everest from Googles Elevation API...") 

    import ElevationJsonProtocol._ 

    val pipeline = sendReceive ~> unmarshal[GoogleApiResult] 

    val responseFuture = pipeline (
    Get("http://maps.googleapis.com/maps/api/elevation/json?locations=27.988056,86.925278&sensor=false") 
    ) 

    responseFuture onComplete { 
    case Success(GoogleApiResult(_, Elevation(_, elevation) :: _)) => 
     log.info("The elevation of Mt. Everest is: {} m", elevation) 
     shutdown() 

    case Success(somethingUnexpected) => 
     log.warning("The Google API call was successful but returned something unexpected: '{}'.", somethingUnexpected) 
     shutdown() 

    case Failure(error) => 
     log.error(error, "Couldn't get elevation") 
     shutdown() 
    } 

    def shutdown(): Unit = { 
    IO(Http).ask(Http.CloseAll)(1.second).await 
    system.shutdown() 
    } 
} 

回答

1

我真的不使用淘金者,我用JSON發揮噴霧。但是一眼就可以看出,需要有一個支持你的隱式編解碼器的argonaut支持特性/導入,才能轉換爲噴霧的解組器(類似的東西是玩json所必需的)。

https://github.com/dwhjames/argonaut-spray

這個庫似乎是你想要的。你的暗示和進口看起來不錯,拉圖書館應該解決你的問題。

相關問題