2016-11-18 4 views
3

JSONデータを変換するときにspotify APIにwsを使用してクエリのトラックのリストを照会しています私は私が把握していましたエラーを取得していますケースクラスは...メソッドの値がオーバーロードされています(String => SearchController.this.TrackSearch)

class SearchController @Inject() (
    val ws: WSClient 
    ) extends Controller { 

    case class TrackSearch(href: String) 

    implicit val trackResultsReads: Reads[TrackSearch] = (
     (__ \ "tracks" \ "href").read[String] 
    )(TrackSearch.apply _) 

    def index = Action.async { implicit request => 
    search("track", param(request, "q")).map { r => 
     val ts = r.json.as[TrackSearch] 
     println(ts) 
     Ok 
    } 
    } 

    private def search(category: String, query: String): Future[Try[WSResponse]] = { 
    ws.url("https://api.spotify.com/v1/search") 
     .withQueryString("q" -> query, "type" -> category) 
     .get() 
     .map(Success(_)) 
     .recover { case x => Failure(x) } 
    } 

    private def param(request: Request[AnyContent], name: String): String = { 
    request.queryString.get(name).flatMap(_.headOption).getOrElse("") 
    } 
} 

私は取得していますエラーは次のとおりです。

Overloaded method value [read] cannot be applied to (String => SearchController.this.TrackSearch) 

    implicit val trackResultsReads: Reads[TrackSearch] 
> (__ \ "tracks" \ "href").read[String] 
)(TrackSearch.apply _) 

私は自分の行動にJSPathを照会した場合、私は "href"文字列を元に戻すことができるので、それはそうではありません:

println(r._2.json \ "tracks" \ "href") 

答えて

4

問題は1つのフィールドしかないことです。 2番目のフィールドを追加すると、コンパイルされます。なぜ私はそれが単一のフィールドでコンパイルされるべきではないかを完全に理解していません。だから、単一のフィールドの場合には、以下を試してみてください。

implicit val trackResultsReads: Reads[TrackSearch] = { 
    ((__ \ "tracks" \ "href").read[String]) 
    .map(TrackSearch(_)) 
} 

Here私は上記を見つけたかなり古いリンクです。別のアプローチで同様のSOの質問についてはthis linkを参照してください。

関連する問題