5

Mam następujący czytelnik JSON w zagraj 2.3:play Json Odczytuje i String

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

i kompilator daje mi błąd

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

gdybym użyć implicit val uzyskać

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] 

Jak mogę to uruchomić?

Odpowiedz

5

otrzymuję inny błąd, ale to działa dobrze dla mnie, gdybym dodać wyraźnie parametr typu do minLength:

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

Myślę, że problem z opuszczeniem że do kompilatora jest to, że istnieją różne kombinacje implikacji w zakresie, który byłby zgodny z domyślną listą parametrów minLength.

0

DefaultReads dostarcza czytelnikom potrzebne do przekształcania wartości json do wspólnych typów (String, Option, Array, etc.). Dostarczenie nowych czytników dla String nie jest konieczne.

W związku z tym, aby uzyskać dostęp do pola w obiekcie Json, nie musisz definiować czytnika, chyba że chcesz odczytać to pole w dowolny typ.

Wszystko, czego potrzebujesz w tym przypadku, to ograniczenie zdefiniowane zarówno w Reads, jak i Constraints. Więc zakładając, że obiekt JSON jest jsValue następujący kod daje Ci to, co chcesz:

// val jsValue = ... 

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

to daje mi ten sam błąd niestety – elmalto

+0

miał swój usunięte jawnej czytelnika? (po prostu usuń 'val airportSearchReads: Czyta [String] = (JsPath \" search ") przeczytaj [String] (minLength (3)' first). –

+0

nadal ten sam problem ... rozwiązanie na górze działa, więc będę użyj tego, dziękuję bardzo za pomoc – elmalto