5

Ho la seguente lettore di JSON in Play 2.3:gioco JSON Legge e String

import play.api.libs.json._ 
import play.api.libs.json.Reads._ 
val airportSearchReads: Reads[String] = (JsPath \ "search").read[String](minLength(3)) 

e il compilatore mi dà l'errore

diverging implicit expansion for type play.api.libs.json.Reads[M] 
starting with method ArrayReads in trait DefaultReads 

se uso un implicit val ottengo

ambiguous implicit values: 
both value uuidReads in trait DefaultReads of type => play.api.libs.json.Reads[java.util.UUID] 
and value airportSearchReads in object AirportSearch of type => play.api.libs.json.Reads[String] 
match expected type play.api.libs.json.Reads[M] 

Come posso farlo funzionare?

risposta

5

ottengo un errore diverso, ma funziona bene per me, se posso aggiungere un parametro di tipo esplicito alla minLength:

scala> val airportSearchReads: Reads[String] = (JsPath \ "search").read[String](minLength[String](3)) 
airportSearchReads: play.api.libs.json.Reads[String] = [email protected] 

Credo che il problema a lasciare che fino al compilatore è che ci sono diverse combinazioni di impliciti in ambito che soddisferebbero l'elenco di parametri impliciti di minLength.

0

DefaultReads fornisce ai lettori necessari per trasformare i valori JSON per tipi comuni (String, Option, Array, etc.). Quindi fornire nuovi lettori per String non è necessario.

Quindi, per accedere a un campo nell'oggetto json non è necessario definire un lettore, a meno che non si desideri leggere quel campo in un tipo arbitrario del proprio.

Tutto ciò che serve in questo caso è il vincolo definito in Reads e Constraints. Quindi, supponendo che l'oggetto JSON è jsValue il seguente codice ti dà ciò che si vuole:

// val jsValue = ... 

(jsValue \ "search").as[String](Reads.minLength(3)) 
+0

questo mi dà lo stesso errore purtroppo – elmalto

+0

Avere il vostro rimosso il vostro lettore implicito? (basta eliminare 'val airportSearchReads: Reads [String] = (JsPath \" search "). read [String] (minLength (3)' first). –

+0

ancora lo stesso problema ... soluzione su top funziona però, quindi lo farò usa quello. grazie mille per il tuo aiuto – elmalto