2012-05-07 7 views
7

Questa è la mia ricerca di oggetti:Play2 non trova la mia implicita Legge o formato 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`) 
    )) 
    } 
} 

Sto cercando utilizzo ot questa classe quando si chiama un webservice utilizzando WS:

val search = response.json.as[Search] 

Ma il compilatore di scala continua a lamentarsi su questa riga:

Nessun deserializzatore Json trovato per tipo models.helper.Search. Prova a implementare una lettura o un formato impliciti per questo tipo.

Qualcuno potrebbe dirmi cosa sto facendo male?

risposta

21

infatti l'esempio è sbagliato. È necessario che il valore implicito Format[Search] sia disponibile nell'ambito implicito.

Nel tuo caso la Format[Search] è definito come un valore della classe annidata Search, quindi si può raggiungere solo da un'istanza di Search.

Quindi, quello che vuoi fare è definirlo in un altro posto, dove potrebbe essere referenziato senza dover creare un'istanza di Search, ad es. in un oggetto Formats:

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

quindi è possibile utilizzare come segue:

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

È inoltre possibile sbarazzarsi della tassa importazione definendo il valore Format[Search] nell'oggetto compagna del Search classe. Infatti il ​​compilatore Scala appare automaticamente negli oggetti compagno di parametri di tipo quando si ha bisogno di un valore implicito di un dato tipo:

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

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

Quindi è possibile utilizzare senza dover importare:

val search = response.json.as[Search]