2012-05-07 61 views
7

這是我的搜索對象:Play2沒有找到我的暗示讀取或格式JSON

package models.helper 
import play.api.libs.json.Format 
import play.api.libs.json.JsValue 
import play.api.libs.json.JsObject 
import play.api.libs.json.JsString 

case class Search (name: String, `type`:String){ 

    implicit object SearchFormat extends Format[Search] { 
    def reads(json: JsValue): Search = Search(
     (json \ "name").as[String], 
     (json \ "type").as[String] 
    ) 

    def writes(s: Search): JsValue = JsObject(Seq(
     "name" -> JsString(s.name), 
     "type" -> JsString(s.`type`) 
    )) 
    } 
} 

使用WS調用WebService時,我試圖OT使用這個類:

val search = response.json.as[Search] 

但scala編譯器不斷在這條線上抱怨:

找不到類型爲models.helper.Search的Json反序列化器。嘗試 實現此類型的隱式讀取或格式。

有人能告訴我我做錯了什麼嗎?

回答

21

確實這個例子是錯誤的。您需要隱含的Format[Search]值在隱式範圍內可用。

在你的情況Format[Search]被定義爲類Search的嵌套值,所以你只能從Search實例達到它。

所以,你想要做的是在另一個地方定義它,在那裏它可以被引用而不必創建Search的實例,例如,在Formats對象:

object Formats { 
    implicit SearchFormat extends Format[Search] { 
    … 
    } 
} 

然後可以按如下方式使用它:

import Formats.SearchFormat 
val search = response.json.as[Search] 

還可以獲得由Search的同伴對象定義Format[Search]值擺脫進口稅的類。事實上,Scala編譯器會自動查找的類型參數的同伴對象時,它需要一個給定類型的隱含價值:

case class Search(name: String, `type`: String) 

object Search { 
    implicit object SearchFormat extends Format[Search] { 
    … 
    } 
} 

然後你可以使用它,而無需將其導入:

val search = response.json.as[Search]