dan*_*oks 3 json scala playframework
我正在查询spotify api以获取给定查询的轨道列表ws,当我将JSON数据转换为案例类时,我收到的错误是我还没弄明白...
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("")
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
Overloaded method value [read] cannot be applied to (String => SearchController.this.TrackSearch)
implicit val trackResultsReads: Reads[TrackSearch]
> (__ \ "tracks" \ "href").read[String]
)(TrackSearch.apply _)
Run Code Online (Sandbox Code Playgroud)
如果我在我的操作中查询JSPath,我可以将"href"字符串恢复正常,所以它不是这样的:
println(r._2.json \ "tracks" \ "href")
Run Code Online (Sandbox Code Playgroud)
问题是只有一个领域.如果你添加了第二个字段,它将编译.我不完全理解为什么它不应该用单个字段编译.因此,在单场案例中,请尝试以下方法:
implicit val trackResultsReads: Reads[TrackSearch] = {
((__ \ "tracks" \ "href").read[String])
.map(TrackSearch(_))
}
Run Code Online (Sandbox Code Playgroud)
这是我发现上述内容的相当古老的链接.另请参阅此链接以获取具有不同方法的类似SO问题.